自定义可视化

一旦创建,VisualizationGraph 对象可以通过多种方式进行修改,以调整下次渲染时的可视化效果。在本节中,我们将讨论如何设置节点的颜色、大小和固定位置,以及如何直接修改现有 VisualizationGraph 对象中的节点和关系。

如果您尚未创建 VisualizationGraph 对象,请参考以下部分之一:

设置节点标题

节点标题是可视化中显示在节点上的文本标签。

set_node_captions 方法

通过调用 neo4j_viz.VisualizationGraph.set_node_captions() 方法,您可以根据节点字段(如 idsize 等)或节点属性(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)

为图表着色

节点和关系可以在创建时通过提供颜色字段直接进行着色。这可以通过将颜色作为字符串传递给 NodeRelationship 对象的 color 参数来实现。

默认情况下,节点将根据其标题进行着色。这些颜色与 Neo4j 控制台 (Neo4j Console) 和 Neo4j 浏览器 (Neo4j Browser) 等其他 Neo4j 工具中的颜色一致。

或者,您也可以在 VisualizationGraph 对象创建后,根据字段或属性为节点或关系着色。

color_nodescolor_relationships 方法

通过调用 neo4j_viz.VisualizationGraph.color_nodes()neo4j_viz.VisualizationGraph.color_relationships() 方法,您可以根据字段或属性(Node.propertiesRelationship.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

在这种情况下,具有相同字段值的所有项都将获得相同的颜色。

如果颜色的数量少于提供的 fieldproperty 的唯一值数量,颜色将循环使用。为避免这种情况,您可以使用更大的调色板或用额外颜色扩展调色板。有关如何执行后者的示例,请参阅 可视化 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
)

在这种情况下,节点或关系将根据属性的值进行着色,最小值使用第一个颜色,最大值使用最后一个颜色。由于我们在范围中只提供了五种颜色,渐变的粒度将限制为五个级别。

palettablematplotlib 是创建自定义颜色渐变的优秀库。

设置节点和关系的大小

节点可以在创建时通过提供大小字段直接设置大小。这可以通过将大小作为整数传递给 Node 对象的 size 参数来实现。

关系可以在创建时通过提供宽度字段直接设置宽度。这可以通过将大小作为整数传递给 Relationship 对象的 width 参数来实现。

或者,您可以在 VisualizationGraph 对象创建后调整它们的大小。

resize_nodes 方法

通过调用 neo4j_viz.VisualizationGraph.resize_nodes() 方法,您可以通过以下方式调整节点大小:

  • 将新的节点大小作为字典 sizes 传递,映射节点 ID 到像素大小;或

  • 提供两个数字的元组 node_radius_min_max:节点将缩放到的最小和最大半径(大小,以像素为单位)。

或者,您可以同时提供 sizesnode_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 对象的 nodesrelationships 字段直接进行修改。这些字段分别列出了图中的所有 NodesRelationships

每个节点和关系都有可以直接访问和修改的属性,如下例所示:

# 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

对节点和关系所做的任何更改都将反映在下一次渲染的图表中。