今天是我的可视化课程上线的第201天,目前学员402人,每篇原创公众号都会记录这个人数,用来督促和激励我的原创内容。目前课程的主要方向是 科研、统计、地理相关的学术性图形绘制方法,后续也会增加商务插图、机器学等、数据分析等方面的课程。
参与课程的你将获取到:学员答疑、可视化资源分享、可视化技巧补充、可视化业务代做(学员和甲方对接)、副业交流、提升认知等等。
今天给大家介绍Python语言中绘制网络结构图的可视化拓展工具-NetworkX包。NetworkX提供了丰富的数据结构和函数,使得用户能够轻松地构建、分析和可视化复杂网络。
pip install networkx
NetworkX 允许你创建不带权重或带权重的图,有向图或无向图。例如,创建一个简单的无向图:
import networkx as nx
# 创建一个无向图
G = nx.Graph()
G.add_nodes_from([1, 2, 3])
G.add_edges_from([(1, 2), (2, 3)])
NetworkX 提供了多种方法来可视化图结构。其中,networkx.draw() 函数是最基本的方法:
import matplotlib.pyplot as plt
# 可视化无向图
nx.draw(G, with_labels=True, node_color='skyblue', node_size=2000, font_size=20)
plt.show()
你可以自定义图的可视化,包括节点颜色、大小、标签等。例如,设置节点颜色、标签和边的样式:
# 自定义节点颜色和标签
node_color = ['red', 'green', 'blue']
labels = {1: 'Node 1', 2: 'Node 2', 3: 'Node 3'}
# 绘制自定义样式的图
nx.draw(G, with_labels=True, labels=labels, node_color=node_color, node_size=2000, font_size=20, font_color='white', edge_color='gray')
plt.show()
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(1, 3)
G.add_edge(1, 5)
G.add_edge(2, 3)
G.add_edge(3, 4)
G.add_edge(4, 5)
# explicitly set positions
pos = {1: (0, 0), 2: (-1, 0.3), 3: (2, 0.17), 4: (4, 0.255), 5: (5, 0.03)}
options = {
"font_size": 36,
"node_size": 3000,
"node_color": "white",
"edgecolors": "black",
"linewidths": 5,
"width": 5,
}
nx.draw_networkx(G, pos, **options)
# Set margins for the axes so that nodes aren't clipped
ax = plt.gca()
ax.margins(0.20)
plt.axis("off")
plt.show()
基础案例01
import matplotlib.pyplot as plt
import networkx as nx
# A rainbow color mapping using matplotlib's tableau colors
node_dist_to_color = {
1: "tab:red",
2: "tab:orange",
3: "tab:olive",
4: "tab:green",
5: "tab:blue",
6: "tab:purple",
}
# Create a complete graph with an odd number of nodes
nnodes = 13
G = nx.complete_graph(nnodes)
# A graph with (2n + 1) nodes requires n colors for the edges
n = (nnodes - 1) // 2
ndist_iter = list(range(1, n + 1))
# Take advantage of circular symmetry in determining node distances
ndist_iter += ndist_iter[::-1]
def cycle(nlist, n):
return nlist[-n:] + nlist[:-n]
# Rotate nodes around the circle and assign colors for each edge based on
# node distance
nodes = list(G.nodes())
for i, nd in enumerate(ndist_iter):
for u, v in zip(nodes, cycle(nodes, i + 1)):
G[u][v]["color"] = node_dist_to_color[nd]
pos = nx.circular_layout(G)
# Create a figure with 1:1 aspect ratio to preserve the circle.
fig, ax = plt.subplots(figsize=(8, 8))
node_opts = {"node_size": 500, "node_color": "w", "edgecolors": "k", "linewidths": 2.0}
nx.draw_networkx_nodes(G, pos, **node_opts)
nx.draw_networkx_labels(G, pos, font_size=14)
# Extract color from edge data
edge_colors = [edgedata["color"] for _, _, edgedata in G.edges(data=True)]
nx.draw_networkx_edges(G, pos, width=2.0, edge_color=edge_colors)
ax.set_axis_off()
fig.tight_layout()
plt.show()
基础案例02
import matplotlib.pyplot as plt
import networkx as nx
G = nx.balanced_tree(3, 5)
pos = nx.nx_agraph.graphviz_layout(G, prog="twopi", args="")
plt.figure(figsize=(8, 8))
nx.draw(G, pos, node_size=20, alpha=0.5, node_color="blue", with_labels=False)
plt.axis("equal")
plt.show()
Circular Tree
其他案例如下:
Betweenness Centrality
Beam Search
Atlas
更多关于NetworkX包的用法和案例可参考:NetworkX包官网[1]
另:本人编写的《科研论文配图绘制指南-基于Python》一书也在修正和新增内容中,也会增加更多关于NetworkX包绘制科研图形的案例。
如何快速的掌握科研绘图技巧?可以考虑以下几点:
这里笔者建议,在资金允许的前提下,可以报名一个长期有效的可视化课程,别报名那种合集资料、没后期服务的课程。建议参加那种作者本人录制视频、有详细代码和数据、有后期服务、有观课平台(如果这个都没有,真的不建议大家购买,说的再好都不要购买)。如果课程持续更新的最好,最好课程本人有一定影响力(比如出书或者大V),那样自己的权益也会收到保障。 参考资料
[1]
NetworkX包官网: https://networkx.org/documentation/stable/index.html#。