scipy: फ्रेम, कुल्हाड़ियों, केवल सामग्री के बिना savefig


92

Numpy / scipy में मेरे पास एक अरै में एक इमेज है। मैं इसे प्रदर्शित कर सकता हूं, मैं इसे savefig बिना किसी सीमा, कुल्हाड़ियों, लेबल, शीर्षक के उपयोग से बचाना चाहता हूं ... बस शुद्ध छवि, और कुछ नहीं।

मैं की तरह संकुल से बचना चाहते हैं PyPNGया scipy.misc.imsave, वे कभी कभी समस्याग्रस्त हैं (वे हमेशा अच्छी तरह से स्थापित नहीं करते, केवल बुनियादी savefig()मेरे लिए

जवाबों:


115

संपादित करें

इसके बाद से बदल aspect='normalगया aspect='auto'है कि matplotlib के हाल के संस्करणों में बदल गया (@ ल्यूक 19 के लिए धन्यवाद)।


मान लेना:

import matplotlib.pyplot as plt

फ्रेम के बिना एक आंकड़ा बनाने के लिए:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

सामग्री को पूरा आंकड़ा भरने के लिए

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

फिर उस पर अपनी छवि बनाएं:

ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)

aspectपैरामीटर पिक्सेल आकार बदलता है सुनिश्चित करें कि वे आंकड़ा आकार में निर्दिष्ट भरने बनाने के लिए fig.set_size_inches(…)। इस तरह की चीजों के साथ खेलने का तरीका महसूस करने के लिए , विशेष रूप से एक्सिस, एक्सिस और आर्टिस्ट के विषय पर मैटलपोटलिब के प्रलेखन के माध्यम से पढ़ें ।


4
नहीं, मेरे पास अभी भी कुछ छोटी पारदर्शी सीमा है, और जो मैं चाहता हूं, वह बिल्कुल भी कोई सीमा नहीं है , शुद्ध छवि
जैकब एम।

5
आप मैन्युअल रूप से सेट करते हैं wऔर hमें पैरामीटर fig.set_size_inches(w,h)और dpiमें पैरामीटर fig.savefig(fname, dpi)इतना है कि यह 24px से 24px में परिणाम है, यह सिर्फ ठीक काम करना चाहिए। उदाहरण के लिए, w = h = 1औरdpi = 24
matehat

5
मुझे इस उत्तर और मोस्ताफ़ा पपरवार द्वारा नीचे दिए गए उत्तर को मिलाना था। न केवल आपको कुल्हाड़ियों को बंद करने की आवश्यकता है, बल्कि सफेद स्थान गायब हो जाता है यह सुनिश्चित करने के लिए आपको set_vouble झूठे की आवश्यकता है। (wtf?)
ब्रायस गुइंटा

6
बस इसे matplotlib v2.2.2 का उपयोग करके आज़माया, यह पूरी तरह से काम करता है (सिवाय इसके कि imshowसिंटैक्स बदल गया aspect='auto'है 'normal')।
ल्यूक 19

2
यह सही तरीका है। ax = plt.Axes(fig, [0., 0., 1., 1.])यह क्या काम करता है।
महानवयन

73

एक आसान समाधान लगता है:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

2
इसने मेरे लिए बहुत अच्छा काम किया। इसके अलावा, पैड_ इंच को वांछित आकार में आसानी से बदला जा सकता है। धन्यवाद!
जिज्ञासु २५

27
मुझे अब भी इसके साथ सफेद मार्जिन मिला है।
फैबियो पेरेज़

3
मैं नए संस्करणों के लिए इसे अपडेट करने में सक्षम था / शेष मार्जिन मुद्दे को केवल पारदर्शी = सच जोड़कर fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
mdoc-2011

2
अभी भी कुल्हाड़ी और टिकमार्क और इसके साथ सब कुछ मिला :(
BjornW

3
यह कुछ भी नहीं करता है। यह आपको सभी कुल्हाड़ियों और लेबल के साथ आंकड़ा देगा।
1313e

27

आप अक्ष के अंदर छवि का bbox पा सकते हैं (उपयोग कर रहे हैं get_window_extent), और bbox_inchesछवि के उस हिस्से को बचाने के लिए पैरामीटर का उपयोग करें :

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('/tmp/test.png', bbox_inches=extent)

मैंने यह ट्रिक यहाँ के जो किंग्सटन से सीखी ।


6
बस plt.axis('off')मदद की। अन्य जवाब ज्यादा मदद नहीं करते।
imsrgadich

3
इसने बहुत अच्छा काम किया। हालाँकि मेरे मामले में अभी भी एक छोटी सी सफेद सीमा है। इस सीमा को हटाने का कोई विचार?
user3731622

@ user3731622, कृपया plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)इसके बजाय प्रयास करेंplt.savefig('/tmp/test.png', bbox_inches=extent)
क्लाउड चो

17

मैंने अपने मामले में कई विकल्पों की कोशिश की है, और सबसे अच्छा समाधान यह था:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

उसके बाद अपने फिगर को सेव करें savefig


1
इन सभी समाधानों में से, यह एकमात्र ऐसा काम है जो मेरे लिए काम करता है।
पफ

8

मैं यहाँ से थोड़े से जोड़ के साथ heron13 उत्तर देने का सुझाव दूंगा ताकि बॉक्स को टाइट मोड पर सेट करने के बाद बचे पैडिंग को हटाया जा सके, इसलिए:

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

मुझे एक त्रुटि मिल रही है कह रही हो get_xaxis () और get_yaxis () मौजूद नहीं है। किसी भी विचार क्यों होता है?
जैकब मालाचॉस्की

एक कुल्हाड़ी () ऑब्जेक्ट बनाएं, फिर ax.xaxis और ax.yaxis का उपयोग करें
पेरीगोन

'सूची' ऑब्जेक्ट के पास कोई विशेषता नहीं है 'get_xaxis' कहने में त्रुटि हुई
Haozhe Xie


3

मुझे लिब्रोसा का उपयोग करते हुए कुछ दृश्य करने में भी यही समस्या थी जहां मैं किसी अन्य जानकारी के बिना प्लॉट की सामग्री निकालना चाहता था। तो यह मेरा दृष्टिकोण। unutbu उत्तर भी मुझे काम करने में मदद करता है।

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()

यह मुझे सही रास्ते पर मिला, लेकिन मुझे दो समस्याएं थीं: 1) मुझे अपने ज्यूपिटर नोटबुक में फ़ॉन्ट त्रुटि से बचने के लिए डीपीआई को 1 से अधिक संख्या में सेट करना था; और 2) अभी भी एक छोटी सी सीमा थी इसलिए मुझे Bbox को मैन्युअल रूप से बदलना होगा extent.get_points()*np.array([[1.1],[.9]])
बॉब बैक्ले

उत्तर को पूरा करने के लिए धन्यवाद जो किसी और को मदद कर सकता है।
GPrathap

3

किसी के लिए भी जुपिटर में ऐसा करने की कोशिश कर रहा है

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)

2

हालांकि उपरोक्त उत्तर हाशिये और पैडिंग को हटाने के लिए संबोधित करते हैं, उन्होंने लेबल हटाने में मेरे लिए काम नहीं किया। बाद में इस सवाल पर ठोकर खाने वाले किसी व्यक्ति के लिए क्या काम किया गया है:

मान लें कि आप में संग्रहीत चार छवियों से सबप्लॉट का 2x2 ग्रिड चाहते हैं images:

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')

1

मैंने सीमा से छुटकारा पाने की कोशिश की, यहाँ युक्तियों का उपयोग करके, लेकिन वास्तव में कुछ भी काम नहीं किया। कुछ के बारे में और मैंने पाया कि चेहरा बदलने से मुझे जुपिटर लैब में कोई सीमा नहीं मिली (कोई भी रंग सफेद सीमा से छुटकारा पाने के कारण हुआ)। उम्मीद है की यह मदद करेगा।

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

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


1

वास्तव में मैंने हाल ही में यह कोशिश की है और इन सभी लाइनों के बजाय, आप उपयोग कर सकते हैं

plt.imsave(image_path, image)

एक जादू की तरह काम करता है। बस एक लाइन और समस्या हल हो गई।

imsave()

प्रलेखन ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )


0

मेरे लिए, इस कोड ने matehat , unutbu और WHZW कोड से फ्रेम और कुल्हाड़ियों के बिना इनपुट छवि आकार के समान बनाया :

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.axis('off')
viridis = cm.get_cmap('gist_gray', 256)
plt.imshow(data, aspect='auto', cmap=viridis)
plt.tight_layout()
plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)

रनटाइम वातावरण:
पायथन 3.6.10
Matplotlib 3.2.1
OS विंडोज 10

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