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

8.6 KiB
Raw Permalink Blame History

定制 Pyvis 交互式网络图

原文:https://www.askpython.com/python/examples/customizing-pyvis-interactive-network-graphs

在本教程中,我们将学习如何通过向网络图添加可用属性来定制 Python 中的交互式网络图,并使其看起来更好。

也读作:用 Python 创建互动网络图

有许多节点属性可以使可视化变得非常有趣,下面列出了这些属性:

  1. 大小-节点的半径
  2. value节点的半径但根据传递的值进行缩放
  3. 标题–标题意味着当用户悬停在节点上时,显示在节点上的文本
  4. X 和 Y 值–提及节点的 X 和 Y 坐标。
  5. 标签–标签是显示在节点旁边的文本。
  6. color该属性中提到了节点的颜色。

我们开始吧!


代码实现

对于本教程,我们将从一个由 10 个节点组成的简单图形开始,这些节点具有随机边,可以使用下面的 python 代码来构建。

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 参数是最终可视化中节点旁边可见的字符串。

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 属性的形式添加节点的大小,以便将节点缩放到特定的值。为了得到随机比例因子,我们将使用下面的函数。

def generate_size_node():
  v = random.randint(5,20)
  return v

接下来,我们将把 value 属性添加到 add_node 函数中,并将比例因子作为 value 属性的值,就像我们在下面的代码中所做的那样。

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 规格作为下面的颜色。

看看下面的代码和输出。

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'))

指定节点的形状

节点的形状定义了节点在最终可视化中的样子。有许多可用的形状,包括正方形、星形、多边形等。有两种类型的节点。一种类型里面有标签,另一种类型下面有标签。

看看下面的代码,它会将形状分配给节点。看看最终的可视化。

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'))

添加了节点边框宽度

节点的边框宽度定义了节点边框的宽度。看看下面的代码,它将为节点分配边框宽度。看看最终的可视化。

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'))

完整的代码

让我们看一下下面的代码,它将涵盖上面提到的所有自定义属性以及一些额外的属性。除此之外,我们还将显示网络图的物理按钮。我们还将为节点添加标题,并将网络图定向为显示边的箭头。

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'))


结论

在本教程中,我们学习了节点的自定义属性,只需添加一些内容就可以使交互图形更加漂亮。我希望你喜欢网络图以及它们的互动性!

感谢您的阅读!

编码快乐!😃