保存图像时输出空白图像。

345

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

5个回答

488
首先,当T0不为None时会发生什么?我会测试一下,然后调整我传递给plt.subplot()的值;也许尝试值131、132和133,或者依赖于是否存在T0的值。
其次,在调用plt.show()之后,会创建一个新的图形。为了处理这个问题,你可以:
  1. 在调用plt.show()之前调用plt.savefig('tessstttyyy.png', dpi=100)

  2. 通过调用plt.gcf()来保存图形,然后可以随时在此Figure对象上调用savefig()

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

在你的代码中,'tesssttyyy.png' 是空白的,因为它保存了新的图形,但还没有绘制任何内容。


忘记删除 T0 部分了...它之前已经被注释掉了。 - tylerthemiler
27
在启用了%matplotlib inlinejupyter笔记本中,这种情况的一个特殊情况是:savefig调用必须与绘图创建方法在同一单元格内。 - ijoseph
8
有趣的是 plt.show() 会生成一张新图片。确实,这解决了问题。 - user989762
1
有趣的是,如果你在类似Spyder的终端中逐个输入plt.plot、plt.savefig和plt.show等命令,它不会显示图像。把所有命令放到一个脚本中一次性运行,就可以显示出图像了。 - CKM
@CKM 你好。你知道这是为什么吗?我认为这实际上是一个问题,导致像plt.ylabel()这样的函数创建一个新的图形而不是应用于当前的图形(在这里发布),并且保存的图形是空白的。我绘制了一张图并在同一行中保存它(用分号隔开),它可以工作。这只是Spyder的问题吗? - TheSprinter
我尝试了这篇帖子中的所有答案,但仍然没有任何效果。它运行时没有错误,并且成功地创建了文件。 - undefined

262

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

解释: plt.show() 会清除整个图像,所以紧随其后的任何操作都将在一个新的空白图像上进行。


33

对我来说,重新排列函数顺序 修复了问题

  • 首先 保存图表
  • 然后 显示图表

如下所示:

plt.savefig('heatmap.png')

plt.show()

7
调用 savefig() 函数在调用 show() 函数之前可以解决这个问题。
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
让我举一个更详细的例子:
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()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接