手绘风格
手绘风格可视化与 SVG 滤镜
使用自定义 SVG 滤镜创建艺术性的手绘风格图可视化,支持多种边框样式(粗糙、铅笔、粗体)���背景纹理(纸张、阴影线、网格、点阵)。
功能概述
此示例展示了如何创建手绘风格的图可视化,通过自定义节点渲染和 SVG 滤镜实现类似手绘的视觉效果。用户可以选择不同的边框样式(粗糙、铅笔、粗体)和背景纹理(纸张、阴影线、网格、点阵),让图表具有艺术感和人情味。
核心特性实现
手绘节点组件
创建 HandDrawnBox 组件实现手绘边框效果:
<HandDrawnBox variant={node.data.nodeBorderStyle} texture={node.data.nodeBackgroundStyle}>
{nodeContent}
</HandDrawnBox>
组件根据选择的变体和纹理应用不同的 SVG 滤镜和样式。
样式切换控制
提供多个下拉选项控制手绘效果:
<SimpleUISelect data={[
{ value: 'rough', text: 'Rough' },
{ value: 'pencil', text: 'Pencil' },
{ value: 'thick', text: 'Thick' }
]} currentValue={nodeBorderStyle} onChange={setNodeBorderStyle} />
<SimpleUISelect data={[
{ value: 'none', text: 'None' },
{ value: 'paper', text: 'Paper' },
{ value: 'hatch', text: 'Hatch' },
{ value: 'grid', text: 'Grid' },
{ value: 'dots', text: 'Dots' }
]} currentValue={nodeBackgroundStyle} onChange={setNodeBackgroundStyle} />
用户可以独立控制边框样式和背景纹理。
动态样式更新
通过 updateNodeData 更新所有节点的样式:
const changeNodeHandDrawnStyle = async () => {
graphInstance.getNodes().forEach(node => {
graphInstance.updateNodeData(node, {
nodeBorderStyle,
nodeBackgroundStyle
});
});
graphInstance.getLines().forEach(line => {
graphInstance.updateLine(line, {
lineShape: enableHandDrawn ? RGLineShape.Curve8 : RGLineShape.StandardStraight,
});
});
await graphInstance.sleep(50);
graphInstance.moveToCenter();
graphInstance.zoomToFitWithAnimation();
};
样式更改后重新布局以确保节点正确显示。
条件渲染
根据是否启用手绘模式选择不同的节点组件:
<RGSlotOnNode>
{({ node }) => {
const nodeContent = <div>{/* 节点内容 */}</div>;
if (enableHandDrawn) {
return <HandDrawnBox variant={node.data.nodeBorderStyle} texture={node.data.nodeBackgroundStyle}>
{nodeContent}
</HandDrawnBox>
} else {
return <MyNodeContentBox>
{nodeContent}
</MyNodeContentBox>
}
}}
</RGSlotOnNode>
这允许用户在手绘和标准样式之间切换。
SVG 滤镜应用
使用 SVG 滤镜创建手绘效果:
<MySvgFilters />
<div className={`${enableHandDrawn ? 'node-filter-hand-drawn' : ''}`}>
<RelationGraph />
</div>
CSS 类应用 SVG 滤镜到节点,创建粗糙边缘和手绘线条效果。
线条手绘偏移
为线条添加随机偏移以模拟手绘的不规则性:
myJsonData.lines.forEach(line => {
line.fromJunctionPointOffsetX = Math.random() * 10;
line.fromJunctionPointOffsetY = Math.random() * 10;
line.toJunctionPointOffsetX = Math.random() * 10;
line.toJunctionPointOffsetY = Math.random() * 10;
line.junctionOffset = Math.random() * 20 - 10;
line.endMarkerId = 'my-hand-drawn-arrow-end';
});
随机偏移使连接线看起来更像手绘。
创意使用场景
教育和培训材料
创建友好的、非正式的学习材料。手绘风格让复杂的图表更容易接受,减少学习压力。
创意演示
在演讲或演示中使用手绘风格增加创意和个性。特别适合设计、艺术或创意行业的展示。
草图和原型设计
快速创建概念草图或设计原型。手绘风格传达"这是初步想法"的信息,鼓励反馈和迭代。
儿童友好界面
为儿童教育应用创建友好的界面。手绘风格更符合儿童的审美和认知习惯。
故事板和场景规划
在故事板或场景规划中使用手绘风格的图表,保持草图的一致性和视觉连贯性。
白板和协作工具
模拟真实白板体验的数字协作工具。手绘风格让用户感觉像在使用真实白板。
创意写作和头脑风暴
在创意写作或头脑风暴会话中使用手绘风格的思维导图,激发创造力。
不完整和进行中的工作
使用手绘风格表示正在进行或未完成的工作,传达这是草图而非最终产品的信息。
个性化品牌
创建具有独特个性的品牌材料。手绘风格可以让品牌显得更亲切、更人性化。
数据可视化艺术
将数据可视化提升为艺术作品。手绘风格为冷冰冰的数据增添人情味和艺术感。