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 भाग को निकालना भूल गया ... यह पहले टिप्पणी की गई थी।
1

7
इसका एक विशेष मामला सक्षम के jupyterसाथ नोटबुक्स में होता है %matplotlib inline: savefigकॉल प्लॉट निर्माण विधि के समान सेल में होना चाहिए।
जोजफ

3
देखने के plt.show()लिए दिलचस्प एक नई छवि उत्पन्न करता है। दरअसल, इस मुद्दे को हल कर दिया।
user989762

दिलचस्प बात यह है कि अगर आप plt.plot, plt.savefig, plt.show को टर्मिनल में एक-एक करके टाइप करते हैं, जैसे कि स्पाइडर, तो यह अंजीर नहीं दिखाएगा। सभी कमांड को स्क्रिप्ट में रखें और एक बार में चलाएं। यह कथानक को दर्शाता है।
सीकेएम

मेरे समाधान plt.show () plt.draw () fig.set_dpi (200) fig.savefig ( '/ image.png')
EduardoUstarez

110

plt.show() के बाद आना चाहिए plt.savefig()

स्पष्टीकरण: plt.show()पूरी बात को साफ करता है, इसलिए बाद में कुछ भी एक नए खाली आंकड़े पर होगा


4
यही एक तरीका है जिसने मेरी मदद की।
योहान

14
plt.show()पूरी बात को साफ करता है, इसलिए बाद में एक नया खाली आंकड़ा होगा।
भाग्योदय

2
यह वही है जो मेरे बट को बचाया! : DI वास्तव में यह नहीं समझ पा रहा है कि किसी को इसे इस तरह से क्यों लागू करना पड़ा कि छवि दिखाने पर प्लॉट सब कुछ मिटा देता है। दया ...
रोमियो सिएरा

12

मेरे लिए समस्या तय किए गए कार्यों के क्रम को बदलें :

  • सबसे पहले प्लॉट सेव करें
  • फिर प्लॉट दिखाएं

निम्नलिखित के रूप में:

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

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.