「 Python数据可视化系列」7.可视化图和网络

来源 | 「Practical Python Data Visualization  A Fast Track Approach To Learning Data Visualization With Python」

作者 | Ashwin Pajankar

译者 | Liangchu

校对 | gongyouliu

编辑 | auroral-L

全文共3050字,预计阅读时间15分钟。


第七章  可视化图和网络


目录

 

  

  一、图和网络

    1、Python3中的图

  二、在Python3中可视化图
  三、图的更多类型

  四、为节点指定自定义标签
  ❤总结

在第六章 「图像可视化和3D图形」中,我们用Python 3和Matplotlib演示了图像和三维对象的可视化,并且还学习了一些图像处理的操作。

本章重点介绍数据结构的可视化,即图(graph)和网络(network)。让我们通过学习以下内容继续我们的数据可视化之旅:

• 图和网络

• 在Python 3中可视化图

• 图的更多类型

• 为节点指定自定义标签

完成本章之后,你将能够使用Python 3可视化图和网络。

一、图和网络

图是一种抽象数据类型,它也被称为网络。它由一组有限的顶点(也称为节点)和一组有限的边(也称为链接)组成。当我们提到一个图时,术语顶点和边也常常会被提到。节点和链接是我们描述像网络这样的相同结构时使用的术语。在本章中,为了表述的一致性,我使用图、节点和边等术语来表示此数据结构。

在图中,顶点通过边相互连接。树是图的子类型,在图中可以有圆圈(形成回路),但在树中是不能形成回路的。我们也可以把图分为有向图(directed graphs)和无向图(undirected graphs)。边在图中可以被赋值,这种图称为加权图(weighted graph)。在这一章中,我们讨论无向图和无权图的可视化。

1.Python 3中的图

为了方便地使用和可视化图形,我们将使用名叫networkx的Python 3库。你可以通过在Jupyter Notebook单元格中运行以下命令来安装它:

!pip3 install network

现在,导入它和另一个库Matplotlib。我们还将在笔记本中启用绘图:

%matplotlib inline

import networkx as nx

import matplotlib.pyplot as plt

你可以创建一个新的空图形,如下所示:

G = nx.Graph()

现在让我们确定它的类型,如下所示:

type(G)

以下是输出:

networkx.classes.graph.Graph

你可以查看节点和边的列表,还可以看到它们的数据类型,如下所示:

print(G.nodes()) 

print(G.edges()) 

print(type(G.nodes())) 

print(type(G.edges()))

这将产生以下输出:

[]

[]

<class 'networkx.classes.reportviews.NodeView'>

<class 'networkx.classes.reportviews.EdgeView'>

可以按如下方式添加节点:

G.add_node('a')

或者也可以添加列表中指定的多个节点:

G.add_nodes_from(['b', 'c'])

我们将再次打印节点列表和边列表(因为我们尚未添加任何边,所以该边列表应为空):

print('Nodes of the graph G: ')

print(G.nodes())

print('Edges of the graph G: ')

print(G.edges())

输出如下所示:

Nodes of the graph G:

['a', 'b', 'c']

Edges of the graph G:

[]

请看以下语句:

G.add_edge(1, 2)

这条语句添加了两个节点和相应的边。如果函数调用中的参数已经是图的节点列表的一部分,则不会再次添加。下面是另一种添加方法:

edge = ('d', 'e')

G.add_edge(*edge)

edge = ('a', 'b')

G.add_edge(*edge)

让我们再次打印节点和边的列表,如下所示:

print('Nodes of the graph G: ')

print(G.nodes())

print('Edges of the graph G: ')

print(G.edges())

我们还可以指定边列表并将其添加到图形中:

G.add_edges_from([('a', 'c'), ('c', 'd'),('a', 1),(1, 'd'),('a', 2)])

现在让我们再次打印所有内容:

print('Nodes of the graph G: ')

print(G.nodes())

print('Edges of the graph G: ')

print(G.edges())

输出如下:

Nodes of the graph G:

['a', 'b', 'c', 1, 2, 'd', 'e']

Edges of the graph G:

[('a', 'b'), ('a', 'c'), ('a', 1), ('a', 2), ('c', 'd'), (1, 2), (1, 'd'), ('d', 'e')]

二、在Python 3中可视化图

本节重点介绍networkx库中图形的可视化。你已经在前面的部分准备了一个图。现在你可以将它可视化如下:

nx.draw(G)

plt.show()

输出如图(7-1)所示:

 

请注意,这些可视化是随机生成的,每次运行语句时,它都会为可视化表示创建不同的图像。然而,这些不同的可视化所代表的图形是同构的。

如图(7-2)显示了再次执行同一单元格时的输出:

 

如你所见,这两个可视化是同构的,因为它们是从同一个图形生成的。你还注意到节点不显示任何名称,所以可以使用以下代码显示节点的名称:

nx.draw(G, with_labels=True) 

plt.show()

结果如图(7-3)所示:

 

若要以粗体显示节点的标签,请使用以下代码:

nx.draw(G, with_labels=True, font_weight='bold') 

plt.show()

可视化如图(7-4)所示:

 

 

三、图的更多类型

接下来,我们可以看一下更多类型的图及其可视化效果。第一种是线性图( linear graph )也叫路径图(path graph),连接到图中某个节点的节点数称为该节点的度(degree)。我们可以这样说:一个路径图是一个图,该图中有两个节点的度数为1,其余节点的度数为2。倘若我们直观地排列一个路径图,它看起来就像一条分段的线。要创建路径图,请运行以下代码:

G = nx.path_graph(4) 

To display the nodes and edges, use this code: 

print('Nodes of the graph G: ') 

print(G.nodes()) 

print('Edges of the graph G: ') 

print(G.edges())

以下是输出:

Nodes of the graph G: 

[0, 1, 2, 3] 

Edges of the graph G: 

[(0, 1), (1, 2), (2, 3)]

接下来让我们创建它的可视化:

nx.draw(G, with_labels=True) 

plt.show()

结果如图(7-5)所示:

 

 

下一种图是Petersen图,它是一种有10个顶点和15条边的无向图。我们可以使用以下代码创建它,并且查看边和节点的值:

G = nx.petersen_graph() 

print('Nodes of the graph G: ') 

print(G.nodes()) 

print('Edges of the graph G: ') 

print(G.edges())

我们可以将它可视化如下:

nx.draw(G, with_labels=True) 

plt.show()

输出如图(7-6)所示:

 

 

现在有很多方法可以更好地将它画出来。我们可以把它描绘成一个五角大楼,里面有一个五角星,有五条辐条。下面的代码就是这样做的:

nx.draw_shell(G,nlist[range(5,10),range(5)],with_labels=True,font_weight='bold') 

plt.show()

此代码以shell形式显示它。我们在参数nlist中提到了节点的逐层列表。下图(7-7)中显示的输出与前面的输出同构:

 

 

我们可以自定义图形的绘制方式。使用以下代码自定义节点大小和线条宽度:

options = {'node_color': 'black', 'node_size': 100, 'width': 3}

现在让我们用这些选项来可视化Petersen图:

nx.draw_random(G, **options) 

plt.show()

如图(7-8)显示了输出:

 

 

接下来,我们可以将其可视化为圆形构造,如下所示:

nx.draw_circular(G, **options) 

plt.show()

输出如图(7-9)所示:

 

 

我们还可以以光谱构造描绘彼得森图,如下所示:

nx.draw_spectral(G, **options) 

plt.show()

如图(7-10)显示了输出:

 

 

我们可以在shell配置中用如下自定义选项描绘Petersen图:

nx.draw_shell(G, nlist=[range(5, 10), range(5)], **options) 

plt.show()

输出如图(7-11)所示:

 

 

我们还可以创建一个十二面体图,如下所示:

G = nx.dodecahedral_graph()

它可以以shell形式可视化,如下所示:

shells = [[2, 3, 4, 5, 6],[8, 1, 0, 19, 18,17, 16, 15, 14, 7],[9, 10, 11, 12, 13]] 

nx.draw_shell(G, nlist=shells, **options) 

plt.show()

如图(7-12)显示了输出:

 

可以使用以下命令将图形保存为磁盘上的文件:

plt.savefig('graph.png')

此语句将文件保存在程序所在位置的磁盘上(与笔记本相同的目录下)。

四、为节点指定自定义标签

可以使用以下代码为节点指定自定义标签:

G = nx.path_graph(4) 

cities = {0: 'Mumbai', 1: 'Hyderabad', 2: 'Banglore', 3: 'New York'} 

H=nx.relabel_nodes(G, cities) 

print('Nodes of the graph H: ') 

print(H.nodes()) 

print('Edges of the graph H: ') 

print(H.edges())

输出如下:

Nodes of the graph H: 

['Mumbai', 'Hyderabad', 'Banglore', 'New York'] 

Edges of the graph H: 

[('Mumbai', 'Hyderabad'), ('Hyderabad', 'Banglore'),  

('Banglore', 'New York')]

使用以下代码创建可视化:

nx.draw(H, with_labels=True) 

plt.show()

如图(7-13)显示了输出:

 

 

❤总结

本章探讨了图的概念,介绍了图的不同类型,你学会了用不同的方式可视化它们。现在,你应该熟悉Python 3中图形数据结构的可视化了。

下一章将介绍SciPy的数据科学库——pandas。我们将介绍pandas库中的多种数据结构,包括系列(series)和数据帧(dataframe),并将演示一些数据可视化的示例。


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值