280

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

4

5 回答 5

418

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

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

  1. 先打电话plt.savefig('tessstttyyy.png', dpi=100)再打电话plt.show()

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

例如:

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

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

于 2012-01-26T01:05:28.887 回答
193

plt.show()应该紧随其后plt.savefig()

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

于 2017-11-17T03:57:17.110 回答
21

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

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

如下:

plt.savefig('heatmap.png')

plt.show()
于 2019-08-07T16:04:39.193 回答
4

在 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()
于 2019-12-07T07:30:13.947 回答
2

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

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

在此处输入图像描述

于 2018-07-20T09:33:18.130 回答