本文目录导读:

我来详细介绍如何使用NetworkX进行图可视化,包括多个实用案例。
安装所需库
pip install networkx matplotlib numpy
基础图可视化
简单无向图
import networkx as nx
import matplotlib.pyplot as plt
# 创建空图
G = nx.Graph()
# 添加节点
G.add_nodes_from([1, 2, 3, 4, 5])
# 添加边
G.add_edges_from([(1, 2), (1, 3), (2, 3), (3, 4), (4, 5)])
# 绘制图
plt.figure(figsize=(8, 6))
nx.draw(G, with_labels=True, node_color='lightblue',
node_size=500, font_size=16, font_weight='bold')"Simple Undirected Graph")
plt.show()
有向图
# 创建有向图
DG = nx.DiGraph()
# 添加边(自动添加节点)
DG.add_edges_from([(1, 2), (2, 3), (3, 1), (3, 4), (4, 2)])
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(DG) # 布局算法
nx.draw(DG, pos, with_labels=True, node_color='lightgreen',
node_size=500, font_size=14,
arrows=True, arrowsize=20)"Directed Graph")
plt.show()
复杂图可视化案例
社交网络图
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 创建社交网络
G = nx.karate_club_graph()
plt.figure(figsize=(12, 8))
# 使用不同布局
pos = nx.spring_layout(G, k=0.5, iterations=50)
# 根据度数设置节点大小
node_sizes = [G.degree(node) * 100 for node in G.nodes()]
# 根据度数设置节点颜色
node_colors = [G.degree(node) for node in G.nodes()]
# 绘制
nx.draw(G, pos,
with_labels=True,
node_size=node_sizes,
node_color=node_colors,
cmap=plt.cm.Reds,
edge_color='gray',
font_size=10,
font_weight='bold')
"Karate Club Social Network")
plt.colorbar(plt.cm.ScalarMappable(cmap=plt.cm.Reds),
label='Node Degree')
plt.show()
流程图可视化
import networkx as nx
import matplotlib.pyplot as plt
# 创建流程图
G = nx.DiGraph()
# 添加节点和边
G.add_edge("开始", "数据输入")
G.add_edge("数据输入", "数据处理")
G.add_edge("数据处理", "数据验证")
G.add_edge("数据验证", "是否有效?")
G.add_edge("是否有效?", "数据存储")
G.add_edge("是否有效?", "错误处理")
G.add_edge("错误处理", "数据输入")
G.add_edge("数据存储", "结果输出")
G.add_edge("结果输出", "结束")
plt.figure(figsize=(12, 8))
# 自定义布局
pos = nx.spring_layout(G, k=3, iterations=200)
# 自定义节点样式
node_colors = []
node_shapes = []
for node in G.nodes():
if node in ["开始", "结束"]:
node_colors.append('lightgreen')
elif node in ["是否有效?"]:
node_colors.append('yellow')
else:
node_colors.append('lightblue')
# 绘制
nx.draw(G, pos,
with_labels=True,
node_color=node_colors,
node_size=3000,
node_shape='s',
font_size=12,
font_weight='bold',
edge_color='gray',
arrows=True,
arrowsize=20,
width=2)
"Flow Chart Visualization")
plt.show()
高级可视化技巧
加权图(边权重可视化)
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 创建加权图
G = nx.Graph()
edges = [
(1, 2, 0.3),
(1, 3, 0.5),
(2, 3, 0.1),
(2, 4, 0.8),
(3, 4, 0.6),
(4, 5, 0.4)
]
G.add_weighted_edges_from(edges)
plt.figure(figsize=(10, 8))
pos = nx.spring_layout(G)
# 获取边权重
edge_weights = [G[u][v]['weight'] for u, v in G.edges()]
# 绘制节点
nx.draw_networkx_nodes(G, pos, node_color='lightcoral',
node_size=500)
# 绘制标签
nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold')
# 绘制边(权重影响宽度)
nx.draw_networkx_edges(G, pos,
width=np.array(edge_weights) * 5,
edge_color=edge_weights,
edge_cmap=plt.cm.Blues)
# 添加权重标签
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
"Weighted Graph Visualization")
plt.axis('off')
plt.show()
多图组合
import networkx as nx
import matplotlib.pyplot as plt
# 创建多个子图
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1. 圆形布局
G1 = nx.cycle_graph(8)
pos1 = nx.circular_layout(G1)
nx.draw(G1, pos1, ax=axes[0,0], with_labels=True,
node_color='skyblue', node_size=300)
axes[0,0].set_title("Circular Layout")
# 2. 树形布局
G2 = nx.balanced_tree(3, 3)
pos2 = nx.spring_layout(G2, k=0.3, iterations=50)
nx.draw(G2, pos2, ax=axes[0,1], with_labels=True,
node_color='lightgreen', node_size=300)
axes[0,1].set_title("Tree Layout")
# 3. 随机图
G3 = nx.erdos_renyi_graph(20, 0.2)
pos3 = nx.spring_layout(G3, k=1, iterations=100)
nx.draw(G3, pos3, ax=axes[1,0], with_labels=True,
node_color='lightsalmon', node_size=200)
axes[1,0].set_title("Random Graph")
# 4. 网格图
G4 = nx.grid_2d_graph(4, 4)
pos4 = nx.spring_layout(G4, k=1, iterations=100)
nx.draw(G4, pos4, ax=axes[1,1], with_labels=True,
node_color='lightpink', node_size=300)
axes[1,1].set_title("Grid Graph")
plt.tight_layout()
plt.show()
交互式可视化
使用plotly(需要安装)
# pip install plotly
import networkx as nx
import plotly.graph_objects as go
# 创建图
G = nx.karate_club_graph()
# 获取布局
pos = nx.spring_layout(G, k=0.5, iterations=50)
# 创建边迹
edge_trace = go.Scatter(
x=[],
y=[],
line=dict(width=0.5, color='#888'),
hoverinfo='none',
mode='lines'
)
for edge in G.edges():
x0, y0 = pos[edge[0]]
x1, y1 = pos[edge[1]]
edge_trace['x'] += tuple([x0, x1, None])
edge_trace['y'] += tuple([y0, y1, None])
# 创建节点迹
node_trace = go.Scatter(
x=[],
y=[],
mode='markers+text',
hoverinfo='text',
marker=dict(
showscale=True,
colorscale='YlGnBu',
size=10,
colorbar=dict(thickness=15)
),
text=[str(node) for node in G.nodes()],
textposition="bottom center"
)
for node in G.nodes():
x, y = pos[node]
node_trace['x'] += tuple([x])
node_trace['y'] += tuple([y])
# 创建图表
fig = go.Figure(data=[edge_trace, node_trace],
layout=go.Layout(
title='Interactive Network Graph',
showlegend=False,
hovermode='closest',
xaxis=dict(showgrid=False, zeroline=False),
yaxis=dict(showgrid=False, zeroline=False)
))
fig.show()
实用技巧
保存高质量图像
# 保存为不同格式
plt.savefig('graph.png', dpi=300, bbox_inches='tight')
plt.savefig('graph.pdf', format='pdf', bbox_inches='tight')
plt.savefig('graph.svg', format='svg', bbox_inches='tight')
自定义节点样式
def custom_graph_style():
G = nx.karate_club_graph()
pos = nx.spring_layout(G)
plt.figure(figsize=(12, 8))
# 自定义节点颜色和大小
colors = ['red', 'blue', 'green', 'yellow', 'purple']
node_colors = [colors[i % len(colors)] for i in range(len(G))]
# 自定义边样式
nx.draw_networkx_edges(G, pos, alpha=0.3, edge_color='gray')
# 自定义节点
nx.draw_networkx_nodes(G, pos,
node_color=node_colors,
node_size=[d * 100 for d in dict(G.degree()).values()],
edgecolors='black',
linewidths=2)
# 自定义标签
nx.draw_networkx_labels(G, pos, font_size=8, font_weight='bold')
plt.axis('off')
plt.tight_layout()
plt.show()
custom_graph_style()
这些案例展示了NetworkX进行图可视化的各种方法,根据你的具体需求选择合适的方式,可以创建出既美观又有信息量的图可视化。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播