Matplotlib (pyplot) savefig xuất hình ảnh trống


174

Tôi đang cố gắng tiết kiệm các lô tôi thực hiện bằng matplotlib; tuy nhiên, hình ảnh đang lưu trống.

Đây là mã của tôi:

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)

Và tessstttyyy.png trống (cũng đã thử với .jpg)

Câu trả lời:


285

Đầu tiên, điều gì xảy ra khi T0 is not Nonenào? Tôi sẽ kiểm tra điều đó, sau đó tôi sẽ điều chỉnh các giá trị tôi chuyển đến plt.subplot(); có thể thử các giá trị 131, 132 và 133 hoặc các giá trị phụ thuộc vào việc có T0tồn tại hay không .

Thứ hai, sau khi plt.show()được gọi, một con số mới được tạo ra. Để đối phó với điều này, bạn có thể

  1. Gọi plt.savefig('tessstttyyy.png', dpi=100)trước khi bạn gọiplt.show()

  2. Lưu hình trước khi bạn show()gọi plt.gcf()"lấy số liệu hiện tại", sau đó bạn có thể gọi đối tượng savefig()này Figurebất cứ lúc nào.

Ví dụ:

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

Trong mã của bạn, 'tesssttyyy.png' trống vì nó đang lưu hình mới, không có gì được vẽ.


Quên loại bỏ phần T0 ... nó đã được nhận xét trước đó.
tylerthemiler

7
Một trường hợp đặc biệt xảy ra trong jupytersổ ghi chép có %matplotlib inlinebật: savefigcuộc gọi phải nằm trong cùng một ô với phương thức tạo cốt truyện.
ijoseph

3
Thú vị để xem plt.show()tạo ra một hình ảnh mới. Thật vậy, điều này đã giải quyết vấn đề.
user989762

Thật thú vị, nếu bạn gõ plt.plot, plt.savefig, plt.show từng cái một trong thiết bị đầu cuối như gián điệp, nó sẽ không hiển thị hình. Đặt tất cả các lệnh trong một kịch bản và chạy trong một lần. Nó cho thấy cốt truyện.
CKM

Giải pháp của tôi plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez

109

plt.show() nên đến sau plt.savefig()

Giải thích: plt.show()xóa toàn bộ, vì vậy mọi thứ sau đó sẽ xảy ra trên một hình trống mới


4
Đó là cách duy nhất giúp tôi.
Yauhen

14
plt.show()xóa toàn bộ, vì vậy bất cứ điều gì sau đó sẽ xảy ra trên một con số trống mới.
luckydonald

2
Đây là những gì đã cứu mông của tôi! : DI thực sự không hiểu tại sao người ta phải thực hiện nó theo cách mà cốt truyện xóa mọi thứ khi hiển thị hình ảnh. Đáng tiếc ...
Romeo Sierra

12

thay đổi thứ tự các chức năng đã khắc phục sự cố cho tôi:

  • đầu tiên Lưu cốt truyện
  • sau đó hiển thị cốt truyện

như sau:

plt.savefig('heatmap.png')

plt.show()

2

Gọi savefig trước khi show () làm việc cho tôi.

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

1

hãy để tôi đưa ra một ví dụ chi tiết hơn:

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

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.