【问题标题】:Matplotlib (pyplot) savefig outputs blank imageMatplotlib (pyplot) savefig 输出空白图像
【发布时间】:2012-02-19 05:08:12
【问题描述】:

我正在尝试保存使用 matplotlib 制作的绘图;但是,图像保存为空白。

这是我的代码:

plt.subplot(121)
plt.imshow(dataStack, cmap=mpl.cm.bone)

plt.subplot(122)
y = copy.deepcopy(tumorStack)
y = np.ma.masked_where(y == 0, y)

plt.imshow(dataStack, cmap=mpl.cm.bone)
plt.imshow(y, cmap=mpl.cm.jet_r, interpolation='nearest')

if T0 is not None:
    plt.subplot(123)
    plt.imshow(T0, cmap=mpl.cm.bone)

    #plt.subplot(124)
    #Autozoom

#else:
    #plt.subplot(124)
    #Autozoom

plt.show()
plt.draw()
plt.savefig('tessstttyyy.png', dpi=100)

而且 tessstttyyy.png 是空白的(也尝试使用 .jpg)

【问题讨论】:

    标签: python image matplotlib figure


    【解决方案1】:

    plt.show() 应该在plt.savefig() 之后

    解释:plt.show() 清除了整个事情,所以之后的任何事情都会发生在一个新的空人物上

    【讨论】:

      【解决方案2】:

      在 show() 之前调用 savefig 对我有用。

      fig ,ax = plt.subplots(figsize = (4,4))
      sns.barplot(x='sex', y='tip', color='g', ax=ax,data=tips)
      sns.barplot(x='sex', y='tip', color='b', ax=ax,data=tips)
      ax.legend(['Male','Female'], facecolor='w')
      
      plt.savefig('figure.png')
      plt.show()
      

      【讨论】:

        【解决方案3】:

        更改函数的顺序为我解决了问题

        • 首先 保存情节
        • 然后 显示情节

        如下:

        plt.savefig('heatmap.png')
        
        plt.show()
        

        【讨论】:

          【解决方案4】:

          让我举一个更详细的例子:

          import numpy as np
          import matplotlib.pyplot as plt
          
          
          def draw_result(lst_iter, lst_loss, lst_acc, title):
              plt.plot(lst_iter, lst_loss, '-b', label='loss')
              plt.plot(lst_iter, lst_acc, '-r', label='accuracy')
          
              plt.xlabel("n iteration")
              plt.legend(loc='upper left')
              plt.title(title)
              plt.savefig(title+".png")  # should before plt.show method
          
              plt.show()
          
          
          def test_draw():
              lst_iter = range(100)
              lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
              # lst_loss = np.random.randn(1, 100).reshape((100, ))
              lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
              # lst_acc = np.random.randn(1, 100).reshape((100, ))
              draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")
          
          
          if __name__ == '__main__':
              test_draw()
          

          【讨论】:

            【解决方案5】:

            首先,T0 is not None 会发生什么?我将对其进行测试,然后将传递的值调整为plt.subplot();也许尝试值 131、132 和 133,或者取决于 T0 是否存在的值。

            其次,在调用plt.show() 之后,会创建一个新图形。为了解决这个问题,您可以

            1. 在拨打plt.show()之前先拨打plt.savefig('tessstttyyy.png', dpi=100)

            2. 通过调用plt.gcf()“获取当前图形”来保存你之前的图形show(),然后你可以随时在这个Figure对象上调用savefig()

            例如:

            fig1 = plt.gcf()
            plt.show()
            plt.draw()
            fig1.savefig('tessstttyyy.png', dpi=100)
            

            在您的代码中,“tesssttyyy.png”是空白的,因为它正在保存新的图形,没有绘制任何内容。

            【讨论】:

            • 忘记删除 T0 部分...之前已评论过。
            • 这种情况的一种特殊情况发生在启用了%matplotlib inlinejupyter 笔记本中:savefig 调用必须与绘图创建方法位于同一单元格中。
            • 有趣的是看到plt.show()生成了一个新图像。确实,这解决了问题。
            • 有趣的是,如果在spyder等终端中一一输入plt.plot、plt.savefig、plt.show,就不会显示图了。将所有命令放在一个脚本中并一次性运行。它显示了情节。
            • @CKM 你好。你碰巧知道为什么会这样吗?我在想这实际上是一个问题,它会导致像plt.ylabel() 这样的函数创建一个新图形而不是应用于当前图形(发布here),并且还将图形保存为空白。我绘制了一个图形并将其保存在同一行(由; 分隔)并且它起作用了。这只是 Spyder 的问题吗?
            猜你喜欢
            • 2022-07-07
            • 2022-11-12
            • 2012-10-21
            • 1970-01-01
            • 2011-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多