我正在尝试使用 networkx 创建图像,保存该图像以供稍后使用,然后稍后在其上方叠加一个图。但是,当我尝试加载图像并创建新点时,比例尺显示...
我正在尝试使用 networkx 创建图像,保存该图像以供稍后使用,然后稍后在其上方叠加一个图。但是,当我尝试加载图像并创建新点时,比例似乎不对。我已经尝试了所有可以找到的方法来使它们同步,但我不知道现在还能尝试什么。这是一个简单的例子:
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
G = nx.dodecahedral_graph()
pos = nx.spring_layout(G)
plt.box(False)
nx.draw_networkx_edges(G, pos=pos)
fig.canvas.draw()
data = np.array(plt.gcf().canvas.get_renderer().buffer_rgba(), dtype=np.uint8)
extent = list(plt.xlim() + plt.ylim())
现在我有了一张图,并将该图像保存到 data
,并将该图的范围保存到 extent
。然后我想从 重新绘制该图, data
并覆盖图中的节点,位置存储在 pos
.
plt.imshow(data, extent=extent)
plt.box(False)
nx.draw_networkx_nodes(G, pos=pos, node_color='green')
由于某种原因,原始图像的比例缩小了,因此节点最终的比例变大了,与边缘不匹配。这是我保存图像的方式出了问题吗?
看起来 matplotlib 在保存绘图数据时会在图像两侧添加填充。您可以通过 fig.tight_layout(pad=0)
在代码中添加以下内容来删除此填充:
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
G = nx.dodecahedral_graph()
pos = nx.spring_layout(G)
plt.box(False)
nx.draw_networkx_edges(G, pos=pos)
fig.tight_layout(pad=0)
fig.canvas.draw()
data = np.array(plt.gcf().canvas.get_renderer().buffer_rgba(), dtype=np.uint8)
extent = list(plt.xlim() + plt.ylim())