来源 | 「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),并将演示一些数据可视化的示例。