Python数据可视化艺术:社交网络关系图制作
数据准备与预处理
社交网络数据通常以节点(用户)和边(关系)的形式存储。常见的格式包括CSV、JSON或数据库表。使用pandas
读取数据并进行清洗,确保节点和边的数据完整。
import pandas as pd# 读取节点数据
nodes = pd.read_csv('nodes.csv')
# 读取边数据
edges = pd.read_csv('edges.csv')
构建社交网络图
使用networkx
库构建图结构。节点通常包含用户ID、姓名等属性,边包含关系的权重或类型。
import networkx as nxG = nx.Graph()
# 添加节点
for _, row in nodes.iterrows():G.add_node(row['id'], name=row['name'], group=row['group'])
# 添加边
for _, row in edges.iterrows():G.add_edge(row['source'], row['target'], weight=row['weight'])
可视化布局选择
社交网络图的布局影响可读性。常用的布局包括力导向布局(spring_layout
)、圆形布局(circular_layout
)和随机布局(random_layout
)。
pos = nx.spring_layout(G, k=0.15, iterations=50)
绘制基础网络图
使用matplotlib
绘制基础网络图,设置节点大小、颜色和边透明度。
import matplotlib.pyplot as pltplt.figure(figsize=(12, 12))
nx.draw_networkx_nodes(G, pos, node_size=200, node_color='skyblue', alpha=0.9)
nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
plt.axis('off')
plt.show()
增强可视化效果
为节点和边添加更多属性,如根据节点度调整大小、根据边权重调整宽度。
node_size = [G.degree(n) * 50 for n in G.nodes()]
edge_width = [d['weight'] * 0.5 for u, v, d in G.edges(data=True)]plt.figure(figsize=(12, 12))
nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color='skyblue', alpha=0.9)
nx.draw_networkx_edges(G, pos, width=edge_width, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
plt.axis('off')
plt.show()
使用交互式可视化工具
pyvis
库提供交互式网络图,允许用户缩放、拖拽和查看节点详情。
from pyvis.network import Networknet = Network(height='750px', width='100%', bgcolor='#222222', font_color='white')
net.from_nx(G)
net.show('network.html')
社区检测与颜色编码
使用community
库检测社区结构,并为不同社区分配不同颜色。
import community as community_louvainpartition = community_louvain.best_partition(G)
colors = [partition[n] for n in G.nodes()]plt.figure(figsize=(12, 12))
nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color=colors, cmap=plt.cm.tab20, alpha=0.9)
nx.draw_networkx_edges(G, pos, width=edge_width, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
plt.axis('off')
plt.show()
高级定制与美化
调整图例、标题和背景色,提升整体视觉效果。
plt.figure(figsize=(12, 12))
nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color=colors, cmap=plt.cm.tab20, alpha=0.9)
nx.draw_networkx_edges(G, pos, width=edge_width, alpha=0.5)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
plt.title('社交网络关系图', fontsize=15)
plt.axis('off')
plt.tight_layout()
plt.show()