代码之家  ›  专栏  ›  技术社区  ›  Amanda

同步matplotlib imshow坐标

  •  2
  • Amanda  · 技术社区  · 9 月前

    我正在尝试使用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())
    

    enter image description here

    所以现在我有了一个图表,并将该图像保存到 data ,并已将该图的范围保存到 extent 。然后,我想从以下位置重新绘制该图 数据 并将图中的节点叠加在存储在 pos .

    plt.imshow(data, extent=extent)
    plt.box(False)
    nx.draw_networkx_nodes(G, pos=pos, node_color='green')
    

    enter image description here

    由于某种原因,原始图像的比例缩小了,因此节点最终处于更大的比例,与边缘不匹配。我保存图像的方式有问题吗?

    1 回复  |  直到 9 月前
        1
  •  1
  •   sOrm    9 月前

    似乎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())