可视化 Neo4j 图数据科学 (GDS) 图¶
[ ]:
%pip install graphdatascience
%pip install matplotlib
设置 GDS 图¶
[ ]:
import os
from graphdatascience import GraphDataScience
# Get Neo4j DB URI, credentials and name from environment if applicable
NEO4J_URI = os.environ.get("NEO4J_URI", "bolt://localhost:7687")
NEO4J_AUTH = ("neo4j", None)
NEO4J_DB = os.environ.get("NEO4J_DB", "neo4j")
if os.environ.get("NEO4J_USER") and os.environ.get("NEO4J_PASSWORD"):
NEO4J_AUTH = (
os.environ.get("NEO4J_USER"),
os.environ.get("NEO4J_PASSWORD"),
)
gds = GraphDataScience(NEO4J_URI, auth=NEO4J_AUTH, database=NEO4J_DB)
[ ]:
G = gds.graph.load_cora(graph_name="c2")
[ ]:
# Run some algorithms to use later for visualization
gds.nodeSimilarity.mutate(
G, mutateRelationshipType="SIMILAR", mutateProperty="similarity"
)
gds.pageRank.mutate(G, mutateProperty="pagerank")
gds.louvain.mutate(G, mutateProperty="componentId")
为了可视化,我们建议将节点数量限制在 10k 以下。创建更小子图的好方法是使用 GDS 图的采样或过滤。
[ ]:
G_sample, _ = gds.graph.sample.rwr("sampled", G)
[ ]:
G_sample.node_properties()
[ ]:
G_sample.relationship_properties()
可视化¶
[ ]:
from neo4j_viz.gds import from_gds
VG = from_gds(
gds,
G_sample,
size_property="pagerank",
additional_node_properties=["componentId", "subject"],
)
[9]:
VG.render()
[9]:
更改标题¶
如果想显示节点标签之外的内容,我们也可以更改节点标题。对于此数据集,按科学主题设置标题可能更有意义。
[ ]:
for node in VG.nodes:
node.caption = str(node.properties["subject"])
[11]:
VG.render()
[11]:
着色¶
图的节点有两种主要的着色方式
按离散颜色空间着色,在这种情况下,每个唯一的节点字段或属性将获得一种新颜色
按连续颜色空间着色,在这种情况下,节点将根据颜色范围,根据其字段或属性值着色
我们将首先使用默认颜色基于离散节点属性“subject”为节点着色。
[12]:
VG.color_nodes(property="subject")
VG.render()
[12]:
现在,让我们使用默认颜色,基于我们上面用 PageRank 计算的连续节点字段“size”进行着色。我们将 override=True
设置为 True 以完全替换之前的着色。注意节点是如何从黄色到紫色着色的,以及这如何也对应于节点的尺寸。
[13]:
from neo4j_viz.colors import ColorSpace
VG.color_nodes(field="size", color_space=ColorSpace.CONTINUOUS, override=True)
VG.render()
[13]:
自定义着色¶
在某些情况下,默认颜色太少。例如,如果您有很多社区,您可能需要更多的颜色。
[ ]:
%pip install matplotlib, palettable
[ ]:
from palettable.colorbrewer.qualitative import Dark2_7
import matplotlib.colors as mcolors
number_of_components = len({n.properties["componentId"] for n in VG.nodes})
print(f"Number of components: {number_of_components}")
linear_color_map = Dark2_7.mpl_colormap.resampled(number_of_components)
colors = [mcolors.rgb2hex(linear_color_map(i)) for i in range(number_of_components)]
VG.color_nodes(property="componentId", colors=colors, override=True)
[16]:
VG.render()
[16]:
渲染选项¶
除了改变节点和关系的显示外观外,我们还可以修改渲染本身。例如,一些可用选项是
图布局
渲染器
缩放级别
初始位置
[17]:
from neo4j_viz import Layout
VG.render(layout=Layout.HIERARCHICAL, initial_zoom=0.1, pan_position=(2000, 0))
[17]:
保存可视化¶
[ ]:
from neo4j_viz.options import Renderer
os.makedirs("./out", exist_ok=True)
# Save the visualization to a file
with open("out/cora.html", "w") as f:
f.write(VG.render(renderer=Renderer.CANVAS).data)
清理¶
让我们清理我们在 GDS 中创建的图。
[ ]:
G.drop()
G_sample.drop()