自定义可视化
一旦创建,VisualizationGraph 对象可以通过多种方式进行修改,以调整下次渲染时的可视化效果。在本节中,我们将讨论如何设置节点的颜色、大小和固定位置,以及如何直接修改现有 VisualizationGraph 对象中的节点和关系。
如果您尚未创建 VisualizationGraph 对象,请参考以下部分之一:
-
入门指南:使用
neo4j-viz原语(如 Node、Relationship 以及VisualizationGraph)从零开始创建可视化图表。 -
可视化现有数据:从 Pandas DataFrame 或 Neo4j GDS 投影导入数据。
设置节点标题
节点标题是可视化中显示在节点上的文本标签。
set_node_captions 方法
通过调用 neo4j_viz.VisualizationGraph.set_node_captions() 方法,您可以根据节点字段(如 id、size 等)或节点属性(Node.properties 映射的成员)设置节点标题。
该方法接受一个 override 参数(默认值为 True),用于控制是否替换现有标题。如果 override=False,则仅更新没有标题的节点。
以下是从属性设置节点标题的示例:
# VG is a VisualizationGraph object with nodes that have a "name" property
VG.set_node_captions(property="name")
您还可以从节点字段设置标题,并选择不覆盖现有标题:
# VG is a VisualizationGraph object
VG.set_node_captions(field="id", override=False)
对于需要回退逻辑或想要组合多个属性的更复杂场景,您可以直接迭代节点:
# VG is a VisualizationGraph object
for node in VG.nodes:
caption = node.properties.get("name") or node.properties.get("title") or node.id
node.caption = str(caption)
为图表着色
节点和关系可以在创建时通过提供颜色字段直接进行着色。这可以通过将颜色作为字符串传递给 Node 或 Relationship 对象的 color 参数来实现。
默认情况下,节点将根据其标题进行着色。这些颜色与 Neo4j 控制台 (Neo4j Console) 和 Neo4j 浏览器 (Neo4j Browser) 等其他 Neo4j 工具中的颜色一致。
或者,您也可以在 VisualizationGraph 对象创建后,根据字段或属性为节点或关系着色。
color_nodes 和 color_relationships 方法
通过调用 neo4j_viz.VisualizationGraph.color_nodes() 或 neo4j_viz.VisualizationGraph.color_relationships() 方法,您可以根据字段或属性(Node.properties 或 Relationship.properties 映射的成员)为节点或关系着色。
可以根据离散或连续色彩空间(参见 ColorSpace)进行着色。在离散情况下,从提供的 colors 中为字段/属性的每个唯一值分配一个新颜色。在连续情况下,colors 应该是一个表示范围的颜色列表,用于根据字段/属性的值创建颜色渐变。
默认情况下,将使用适用于浅色和深色模式的 Neo4j 调色板。如果您想使用不同的调色板,可以传递一个字典或可迭代的颜色集合作为 colors 参数。例如,颜色值可以是字符串(如 "blue")、十六进制颜色代码(如 "#FF0000"),甚至是 RGB 值的元组(如 (255, 0, 255))。
如果某些节点或关系已经设置了 color,您可以使用 override 参数选择是否覆盖它。
按离散色彩空间
为了不使用默认颜色,我们可以向着色方法提供一个基于离散字段的自定义颜色列表:
from neo4j_viz.colors import ColorSpace
# VG is a VisualizationGraph object
VG.color_nodes(
field="caption",
colors=["red", "#7fffd4", (255, 255, 255, 0.5), "hsl(270, 60%, 70%)"],
color_space=ColorSpace.DISCRETE
)
# Color relationships based on their caption
VG.color_relationships(field="caption")
颜色允许值的完整列表列在此处。
您也可以使用 palettable 库中的调色板,而不是定义自己的颜色,如下面的代码片段所示:
from palettable.wesanderson import Moonrise1_5
# VG is a VisualizationGraph object
VG.color_nodes(field="caption", colors=Moonrise1_5.colors) # ColorSpace.DISCRETE is default
在这种情况下,具有相同字段值的所有项都将获得相同的颜色。
如果颜色的数量少于提供的 field 或 property 的唯一值数量,颜色将循环使用。为避免这种情况,您可以使用更大的调色板或用额外颜色扩展调色板。有关如何执行后者的示例,请参阅 可视化 Neo4j Graph Data Science (GDS) 图表教程。
按连续色彩空间
为了不使用默认颜色,我们可以提供一个表示范围的自定义颜色列表:
from neo4j_viz.colors import ColorSpace
# VG is a VisualizationGraph object
VG.color_nodes(
property="centrality_score",
colors=[(255, 0, 0), (191, 64, 0), (128, 128, 0), (64, 191, 0), (0, 255, 0)], # From red to green
color_space=ColorSpace.CONTINUOUS
)
# Color relationships based on a "weight" property
VG.color_relationships(
property="weight",
colors=["#E0E0E0", "#000000"], # From light grey to black
color_space=ColorSpace.CONTINUOUS
)
在这种情况下,节点或关系将根据属性的值进行着色,最小值使用第一个颜色,最大值使用最后一个颜色。由于我们在范围中只提供了五种颜色,渐变的粒度将限制为五个级别。
palettable 和 matplotlib 是创建自定义颜色渐变的优秀库。
设置节点和关系的大小
节点可以在创建时通过提供大小字段直接设置大小。这可以通过将大小作为整数传递给 Node 对象的 size 参数来实现。
关系可以在创建时通过提供宽度字段直接设置宽度。这可以通过将大小作为整数传递给 Relationship 对象的 width 参数来实现。
或者,您可以在 VisualizationGraph 对象创建后调整它们的大小。
resize_nodes 方法
通过调用 neo4j_viz.VisualizationGraph.resize_nodes() 方法,您可以通过以下方式调整节点大小:
-
将新的节点大小作为字典
sizes传递,映射节点 ID 到像素大小;或 -
提供两个数字的元组
node_radius_min_max:节点将缩放到的最小和最大半径(大小,以像素为单位)。
或者,您可以同时提供 sizes 和 node_radius_min_max。在这种情况下,字典将首先用于设置节点大小,然后元组的最小值和最大值将随后用于将大小缩放到提供的范围。
如果您仅提供 node_radius_min_max 参数,节点大小将进行缩放,使最小的节点具有第一个值的大小,最大的节点具有第二个值的大小。其他节点将根据其相对大小在这两个值之间进行线性缩放。这在节点大小差异很大,或者全部非常小或非常大时非常有用。
在下面的示例中,我们将 ID 为 42 的节点大小调整为 88 像素,然后将所有节点缩放到 5 到 20 像素之间:
# VG is a VisualizationGraph object
VG.resize_nodes(sizes={42: 88}, node_radius_min_max=(5, 20))
请注意,这意味着 ID 为 42 的节点也将被缩放到 5 到 20 像素之间。
resize_relationships 方法
通过调用 neo4j_viz.VisualizationGraph.resize_relationships() 方法,您可以通过以下方式调整关系宽度:
-
将新的宽度作为字典
widths传递,映射关系 ID 到像素宽度;或 -
提供用于确定大小的关系的
property名称。
在下面的示例中,我们将 ID 为 "r1" 的关系宽度调整为 5:
# VG is a VisualizationGraph object
VG.resize_relationships(widths={"r1": 5})
您还可以根据属性调整关系大小:
# VG is a VisualizationGraph object
VG.resize_relationships(property="weight")
与 resize_nodes 不同,关系宽度是按原样使用的,不会缩放到特定范围。
固定节点
可以将节点固定在可视化中的当前位置,这样它们就不会被力导向布局算法移动。如果您想将节点保持在特定位置(例如为了突出显示它),这非常有用。
节点可以在创建时直接固定。例如,通过将 pinned=True 传递给 Node 对象来实现。
或者,您可以在 VisualizationGraph 对象创建后切换节点固定状态。
toggle_nodes_pinned 方法
通过调用 neo4j_viz.VisualizationGraph.toggle_nodes_pinned() 方法,您可以切换节点是否应被固定。此方法接受一个将节点 ID 映射到布尔值的字典,其中 True 表示节点已固定,False 表示节点未固定。
在下面的示例中,我们固定了 ID 为 1337 的节点,并取消固定了 ID 为 42 的节点:
# VG is a VisualizationGraph object
VG.toggle_nodes_pinned(1337: True, 42: False)})
直接修改节点和关系
节点和关系也可以通过访问现有 VisualizationGraph 对象的 nodes 和 relationships 字段直接进行修改。这些字段分别列出了图中的所有 Nodes 和 Relationships。
每个节点和关系都有可以直接访问和修改的属性,如下例所示:
# VG is a VisualizationGraph object
# Modify the first node and fifth relationship
VG.nodes[0].size = 10
VG.nodes[0].properties["height"] = 170
VG.relationships[4].caption = "BUYS"
# Set the coordinates for all nodes from an existing property
for node in VG.nodes:
node.x = node.properties.get("x")
node.y = node.properties.get("y")
# Change the caption size for all relationships
for relationship in VG.relationships:
relationship.caption_size = 15
对节点和关系所做的任何更改都将反映在下一次渲染的图表中。