【发布时间】:2015-03-18 18:13:20
【问题描述】:
如果你知道如何使用 Matplotlib,你可能不知道 NetworkX 也能回答。
我有 2 个要使用 NetworkX 绘制的网络,我想在一个图形中并排绘制,显示每个网络的轴。本质上,这是在 Matplotlib(NetworkX 用来绘制图形的库)中创建 2 个子图的问题。
网络中每个节点的位置分布在[0, area_size]的区域内,但通常没有坐标x = 0.0或y = area_size的点。也就是说,点出现在 [0, area_size] 或更小的区域内。不是更大。
每个子图的比例应为 0.8 x 1.0,由比例为 0.16 x 1.0 的区域隔开。
本质上应该是这样的(假设 area_size = 100)。
然后我必须在 2 个图之间画线,所以我需要一些方法来回到每个图中的位置,以便将它们连接起来。
像这样生成、存储和分配节点位置
# generate and store node positions
positions = {}
for node_id in G.nodes():
pos_x = # generate pos_x in [0.0, area_size]
pos_y = # generate pos_y in [0.0, area_size]
positions[node_id]['x'] = pos_x
positions[node_id]['y'] = pos_y
G.node[node_id]['x'] = pos_x
G.node[node_id]['y'] = pos_y
然后将这些位置存储在字典pos = {node_id: (x, y), ...} 中。 NetworkX 得到这个结构来在正确的位置绘制节点nx.draw_network(G, pos=positions)。
现在,我执行以下操作:
- 计算第一个网络在[0, area_size]上的位置,然后将它们拉伸到[0, area_size*0.8]
- 用同样的方法计算第二个网络的位置
- 将第二个网络的位置向右移动,将 area_size*0.8 + area_size*0.16 与 x 坐标相加
- 设置图形大小(英寸)
plt.figure(figsize=(h, w), dpi=100) - 设置x轴
plt.xlim(0.0, area_size*0.8*2 + area_size*0.16) - 设置y轴
plt.ylim(0.0, area_size) - 绘制第一个网络(传递其位置)
- 绘制第二个网络(传递其位置)
- 在两个网络之间画线
我得到的图有正确的比例,但轴没有显示正确的信息。我应该隐藏轴并绘制虚拟轴吗?
我可能需要一些更好的程序来绘制正确的子图。
我还注意到,当我导出为 pdf 时,我设置的图形大小并不总是得到尊重。
NetworkX用来画图的函数是these,特别是我用的是draw_networkx。
我真的不介意绘制单独的轴,如果它们太麻烦的话。
【问题讨论】:
-
将要绘制的坐标区对象作为
axkwarg 传递给draw_networkx。 -
我对 matplotlib 还是很陌生。我可以直接在主图上修改轴,但我不明白如何使用
ax来绘制我描述的两个网络。另外,两个网之间还有线。
标签: python matplotlib networkx