Matplotlib (pyplot) savefig แสดงผลภาพเปล่า


174

ฉันพยายามที่จะบันทึกแปลงที่ฉันใช้ 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)

คำตอบ:


286

ครั้งแรกเกิดขึ้นเมื่อ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' ว่างเปล่าเพราะมันกำลังบันทึกรูปใหม่ซึ่งไม่มีการลงจุด


ลืมลบส่วน T0 ... มันถูกคอมเม้นท์ก่อนหน้านี้
tylerthemiler

7
กรณีพิเศษนี้เกิดขึ้นในjupyterสมุดบันทึกที่%matplotlib inlineเปิดใช้งาน: การsavefigโทรต้องอยู่ในเซลล์เดียวกันกับวิธีการสร้างพล็อต
ijoseph

3
น่าสนใจที่จะเห็นplt.show()สร้างภาพใหม่ อันที่จริงสิ่งนี้สามารถแก้ไขปัญหาได้
989762

น่าสนใจถ้าคุณพิมพ์ plt.plot, plt.savefig, plt.show ทีละตัวในเทอร์มินัลเช่นสไปเดอร์มันจะไม่แสดงมะเดื่อ ใส่คำสั่งทั้งหมดในสคริปต์และเรียกใช้ในครั้งเดียว มันแสดงให้เห็นพล็อต
CKM

โซลูชันของฉัน plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez

110

plt.show() ควรมาหลังจาก plt.savefig()

คำอธิบาย: plt.show()ล้างข้อมูลทั้งหมดดังนั้นจะมีอะไรเกิดขึ้นหลังจากนั้นในรูปที่ว่างเปล่าใหม่


4
นั่นเป็นวิธีเดียวที่ช่วยฉัน
เหยาเหมิน

14
plt.show()ล้างข้อมูลทั้งหมดดังนั้นอะไรก็ตามหลังจากนั้นจะเกิดขึ้นกับร่างว่างเปล่าใหม่
luckydonald

2
นี่คือสิ่งที่ช่วยชีวิตฉัน! : DI ไม่เข้าใจจริงๆว่าทำไมต้องใช้ในวิธีที่พล็อตลบทุกอย่างเมื่อแสดงภาพ สงสาร ...
โรมิโอเซียร่า

13

เปลี่ยนลำดับของฟังก์ชั่นแก้ไขปัญหาสำหรับฉัน:

  • ก่อน บันทึกพล็อต
  • จากนั้น แสดงพล็อต

ดังต่อไปนี้:

plt.savefig('heatmap.png')

plt.show()

2

โทร 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()

1

ขอยกตัวอย่างรายละเอียดเพิ่มเติม:

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

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.