geekdoc-python-zh/docs/askpython/customizing-pyvis-interacti...

320 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 定制 Pyvis 交互式网络图
> 原文:<https://www.askpython.com/python/examples/customizing-pyvis-interactive-network-graphs>
在本教程中,我们将学习如何通过向网络图添加可用属性来定制 Python 中的交互式网络图,并使其看起来更好。
***也读作:[用 Python 创建互动网络图](https://www.askpython.com/python-modules/networkx-interactive-network-graphs)***
有许多节点属性可以使可视化变得非常有趣,下面列出了这些属性:
1. 大小-节点的半径
2. value节点的半径但根据传递的值进行缩放
3. 标题–标题意味着当用户悬停在节点上时,显示在节点上的文本
4. X 和 Y 值–提及节点的 X 和 Y 坐标。
5. 标签–标签是显示在节点旁边的文本。
6. color该属性中提到了节点的颜色。
我们开始吧!
* * *
## 代码实现
对于本教程,我们将从一个由 10 个节点组成的简单图形开始,这些节点具有随机边,可以使用下面的 python 代码来构建。
```py
def generate_edge():
s = random.randint(1,10)
d = random.randint(1,10)
return (s,d)
g = net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="A Simple Networkx Graph")
for i in range(1,11):
g.add_node(i)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g.add_edge(eg[0],eg[1])
i+=1
g.show('Simple_Network_Graph.html')
display(HTML('Simple_Network_Graph.html'))
```
生成的网络图看起来有点像下图。
现在,我们将在接下来的章节中一次处理一个节点属性。
### 向图表添加标签
我们可以在 add_node 函数中添加标签作为标签属性。在这种情况下使用下面的代码将标签设置为节点号。label 参数是最终可视化中节点旁边可见的字符串。
```py
def generate_edge():
s = random.randint(1,10)
d = random.randint(1,10)
return (s,d)
g_labels = net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="A Simple Networkx Graph with Labels")
for i in range(1,11):
g_labels.add_node(i,label=str(i))
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_labels.add_edge(eg[0],eg[1])
i+=1
g_labels.show('Simple_Network_Graph_labels.html')
display(HTML('Simple_Network_Graph_labels.html'))
```
生成的网络图如下所示。
### 增加节点的大小
在本节中,我们将以 value 属性的形式添加节点的大小,以便将节点缩放到特定的值。为了得到随机比例因子,我们将使用下面的函数。
```py
def generate_size_node():
v = random.randint(5,20)
return v
```
接下来,我们将把 value 属性添加到 add_node 函数中,并将比例因子作为 value 属性的值,就像我们在下面的代码中所做的那样。
```py
def generate_size_node():
v = random.randint(5,20)
return v
g_sizes = net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="Network Graph with Different Sizes")
for i in range(1,11):
val = generate_size_node()
g_sizes.add_node(i,label=str(i),value=val)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_sizes.add_edge(eg[0],eg[1])
i+=1
g_sizes.show('Simple_Network_Graph_sizes.html')
display(HTML('Simple_Network_Graph_sizes.html'))
```
这是令人惊叹的视觉效果。
### 向节点添加颜色
本节将重点介绍如何给节点添加各种颜色。我们将使用下面的函数以六进制编码的形式生成随机颜色。我们将以颜色属性的形式添加颜色,它也可以采用普通的 HTML 颜色,如红色或蓝色。我们也可以指定完整的 RGBA 或 hexacode 规格作为下面的颜色。
看看下面的代码和输出。
```py
def generate_color():
random_number = random.randint(0,16777215)
hex_number = str(hex(random_number))
hex_number ='#'+ hex_number[2:]
return hex_number
g_colors =net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="Network Graph with Different Colors")
colors=[]
for i in range(1,11):
c = generate_color()
colors.append(c)
while(c in colors):
c = generate_color()
colors.append(c)
val = generate_size_node()
g_colors.add_node(i,label=str(i),color=c,value=val)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_colors.add_edge(eg[0],eg[1])
i+=1
g_colors.show('Simple_Network_Graph_colors.html')
display(HTML('Simple_Network_Graph_colors.html'))
```
### 指定节点的形状
节点的形状定义了节点在最终可视化中的样子。有许多可用的形状,包括正方形、星形、多边形等。有两种类型的节点。一种类型里面有标签,另一种类型下面有标签。
看看下面的代码,它会将形状分配给节点。看看最终的可视化。
```py
def get_random_shape():
shapes = ['box','polygon','triangle','circle','star','cylinder']
r = random.randint(0,len(shapes)-1)
return shapes[r]
g_shapes =net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="Network Graph with Different Shapes")
colors=[]
for i in range(1,11):
c = generate_color()
colors.append(c)
while(c in colors):
c = generate_color()
colors.append(c)
val = generate_size_node()
s = get_random_shape()
g_shapes.add_node(i,label=str(i),color=c,value=val,shape=s)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_shapes.add_edge(eg[0],eg[1])
i+=1
g_shapes.show('Simple_Network_Graph_shapes.html')
display(HTML('Simple_Network_Graph_shapes.html'))
```
### 添加了节点边框宽度
节点的边框宽度定义了节点边框的宽度。看看下面的代码,它将为节点分配边框宽度。看看最终的可视化。
```py
g_borders =net.Network(height='600px',width='90%',
bgcolor='white',font_color="red",
heading="Network Graph with Different BorderWidths")
colors=[]
for i in range(1,11):
c = generate_color()
colors.append(c)
while(c in colors):
c = generate_color()
colors.append(c)
val = generate_size_node()
s = get_random_shape()
b = random.randint(3,5)
g_borders.add_node(i,label=str(i),color=c,
value=val,shape=s,borderWidth=b)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_borders.add_edge(eg[0],eg[1])
i+=1
g_borders.show('Simple_Network_Graph_Borders.html')
display(HTML('Simple_Network_Graph_Borders.html'))
```
## 完整的代码
让我们看一下下面的代码,它将涵盖上面提到的所有自定义属性以及一些额外的属性。除此之外,我们还将显示网络图的物理按钮。我们还将为节点添加标题,并将网络图定向为显示边的箭头。
```py
def generate_edge():
s = random.randint(1,10)
d = random.randint(1,10)
return (s,d)
def generate_size_node():
v = random.randint(5,20)
return v
def generate_color():
random_number = random.randint(0,16777215)
hex_number = str(hex(random_number))
hex_number ='#'+ hex_number[2:]
return hex_number
g_complete =net.Network(height='600px',width='50%',
bgcolor='white',font_color="red",notebook=True,
heading="A Complete Networkx Graph",directed=True)
colors=[]
for i in range(1,11):
c = generate_color()
colors.append(c)
while(c in colors):
c = generate_color()
colors.append(c)
val = generate_size_node()
b = random.randint(3,5)
g_complete.add_node(i,label=str(i),color=c,value=val,
title="Hello! I am Node "+str(i),borderWidth=b)
i=0
chosen_set = []
while(i!=20):
eg = generate_edge()
if(eg[0]!=eg[1] and not (eg in chosen_set)):
chosen_set.append(eg)
g_complete.add_edge(eg[0],eg[1])
i+=1
g_complete.show_buttons(['physics'])
g_complete.show('A_Complete_Networkx_Graph.html')
display(HTML('A_Complete_Networkx_Graph.html'))
```
* * *
## 结论
在本教程中,我们学习了节点的自定义属性,只需添加一些内容就可以使交互图形更加漂亮。我希望你喜欢网络图以及它们的互动性!
感谢您的阅读!
编码快乐!😃
* * *