Matplotlib (pyplot.figure बनाम matplotlib.figure) से फ्रेम कैसे हटाएं (फ्रेमॉन = matplotlib में झूठी समस्या)


160

आकृति में फ्रेम को हटाने के लिए, मैं लिखता हूं

frameon=False

के साथ एकदम सही काम करता है pyplot.figure, लेकिन इसके साथ matplotlib.Figureकेवल ग्रे पृष्ठभूमि को हटाता है, फ्रेम रहता है। इसके अलावा, मैं केवल यह दिखाना चाहता हूं कि लाइनें और बाकी सभी आंकड़े पारदर्शी हों।

pyplot के साथ मैं वह कर सकता हूं जो मैं चाहता हूं, मैं इसे matplotlib के साथ कुछ लंबे समय के लिए करना चाहता हूं क्योंकि मैंने अपने प्रश्न का विस्तार करने के लिए उल्लेख नहीं किया है।


क्या आप स्पष्ट कर सकते हैं कि आप क्या कर रहे हैं? (यानी एक उदाहरण दिखाएं) क्या आप उपयोग कर रहे हैं savefig? (यदि ऐसा है, तो यह आंकड़ा सहेजते समय आपके द्वारा निर्धारित किए गए कुछ को ओवरराइड करता है।) क्या मैन्युअल रूप से fig.patch.set_visible(False)काम करना निर्धारित करता है?
जो किंग्सटन

मैं कैनवस .print_png (प्रतिक्रिया) का उपयोग करता हूं, न कि savefig का।
एम्मेट बी

जवाबों:


178

सबसे पहले, यदि आप उपयोग कर रहे हैं, तो ध्यान savefigरखें कि जब तक आप अन्यथा निर्दिष्ट नहीं करते हैं, तब बचत करते समय यह आंकड़ा की पृष्ठभूमि रंग को ओवरराइड करेगा fig.savefig('blah.png', transparent=True)

हालांकि, अक्षों को हटाने और ऑन-स्क्रीन की पृष्ठभूमि को देखने के लिए, आपको दोनों को सेट करने ax.patchऔर fig.patchअदृश्य होने की आवश्यकता होगी ।

उदाहरण के लिए

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

for item in [fig, ax]:
    item.patch.set_visible(False)

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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

(बेशक, आप एसओ की सफेद पृष्ठभूमि पर अंतर नहीं बता सकते, लेकिन सब कुछ पारदर्शी है ...)

यदि आप लाइन के अलावा कुछ और नहीं दिखाना चाहते हैं, तो अक्ष को बंद करने के साथ-साथ उपयोग भी करें ax.axis('off'):

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

fig.patch.set_visible(False)
ax.axis('off')

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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

उस मामले में, हालांकि, आप कुल्हाड़ियों को पूरा आंकड़ा लेने के लिए तैयार कर सकते हैं। यदि आप कुल्हाड़ियों के स्थान को मैन्युअल रूप से निर्दिष्ट करते हैं, तो आप इसे पूरा आंकड़ा लेने के लिए कह सकते हैं (वैकल्पिक रूप से, आप उपयोग कर सकते हैं subplots_adjust, लेकिन यह एकल कुल्हाड़ियों के मामले के लिए सरल है)।

import matplotlib.pyplot as plt

fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')

ax.plot(range(10))

with open('test.png', 'w') as outfile:
    fig.canvas.print_png(outfile)

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


इसलिए यह आधी समस्या को हल करता है। लेकिन मैं यह भी चाहता हूं कि यह ब्लैक फ्रेम आयत अदृश्य हो। तो केवल नीली रेखा दिखाई देनी चाहिए।
एम्मेट बी

5
ओह, ठीक है, उस मामले में यह और भी सरल है। बस उपयोग करें ax.axis('off')(आपको अभी भी फिगर फ्रेम को बंद करना होगा)।
जो किंग्सटन

धन्यवाद, वहाँ एक तरीका है ticklabels रखने के लिए, जैसे: मैं केवल लेबल चाहते हैं ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B

यह बहुत अच्छा है, मैंने इसे यहां एक और एप्लिकेशन के लिए इस्तेमाल किया: stackoverflow.com/questions/4092927/…
cxrodgers

1
print_png()एक फेंकता TypeError: write() argument must be str, not bytesअजगर 3. लिखने द्विआधारी के रूप में फ़ाइल (खुलने पर मेरे लिए अपवाद 'wb') काम करने के लिए यह आवश्यक है।
गेब्रियल Jablonski

243

ax.axis('off'), के रूप में जो किंग्टन ने कहा, प्लॉटेड लाइन को छोड़कर सब कुछ हटा दें।

उन लोगों के लिए जो केवल फ्रेम (बॉर्डर) को हटाना चाहते हैं, और लेबल, टिकर आदि को रखते हैं, कोई भी ऐसा कर सकता है जो spinesऑब्जेक्ट को अक्ष पर एक्सेस कर सकता है । एक अक्ष वस्तु को देखते हुए ax, निम्नलिखित को सभी चार तरफ की सीमाओं को हटा देना चाहिए:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

और, हटाने xऔर yभूखंड से टिक के मामले में :

 ax.get_xaxis().set_ticks([])
 ax.get_yaxis().set_ticks([])

1
मुझे शीर्ष और दाएं मोच से छुटकारा पाने के लिए यह पसंद है
एड्रियन टॉरी

5
बस जोड़ने के लिए: जब आप भी टिक्स निकालना चाहते हैं: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT

4
इसके अलावा, यदि आप पहले से ही एक नहीं है, तो एक अक्ष वस्तु बनाने के लिए ax = gca () का उपयोग करें।
कैमरूनरोटाइलर

2
यह स्वीकृत उत्तर होना चाहिए। "ax.axis (" बंद ")" जैसे सब कुछ निकालता है: x और y लेबल, x और y टिक और प्लॉट से सभी (4) बॉर्डर। बेहतर अनुकूलन के लिए, प्रत्येक तत्व को अलग तरीके से संभाला जाना चाहिए।
संचित

66

मैटलपोटलिब के नए संस्करणों में बदसूरत फ्रेम से छुटकारा पाने का सबसे आसान तरीका:

import matplotlib.pyplot as plt
plt.box(False)

यदि आपको वास्तव में हमेशा वस्तु उन्मुख दृष्टिकोण का उपयोग करना चाहिए, तो करें ax.set_frame_on(False):।


2
धन्यवाद! यह शायद सबसे साफ समाधान है!
कट्टिया

2
ऑब्जेक्ट ओरिएंटेड एप्रोच का उपयोग करते समय, मुझे सफलता मिली ax.set_frame_on(False), जो कि समान काम करती है। हो सकता है कि उपरोक्त उत्तर में शामिल हो।
Floyd4K

58

पर बिल्डिंग @ peeol उत्तम जवाब , आप भी करने से फ्रेम को हटा सकते हैं

for spine in plt.gca().spines.values():
    spine.set_visible(False)

एक उदाहरण देने के लिए (पूरा कोड नमूना इस पोस्ट के अंत में पाया जा सकता है), मान लीजिए कि आपके पास इस तरह से एक बार प्लॉट है,

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

आप ऊपर दिए गए आदेशों के साथ फ्रेम को निकाल सकते हैं और फिर या तो लेबल x-और ytickलेबल (दिखाए गए प्लॉट नहीं) रख सकते हैं या उन्हें हटा सकते हैं

plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

इस मामले में, एक फिर सलाखों को सीधे लेबल कर सकता है; अंतिम साजिश इस तरह दिख सकती है (कोड नीचे पाया जा सकता है):

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

यहाँ पूरा कोड है जो भूखंडों को उत्पन्न करने के लिए आवश्यक है:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()

xvals = list('ABCDE')
yvals = np.array(range(1, 6))

position = np.arange(len(xvals))

mybars = plt.bar(position, yvals, align='center', linewidth=0)
plt.xticks(position, xvals)

plt.title('My great data')
# plt.show()

# get rid of the frame
for spine in plt.gca().spines.values():
    spine.set_visible(False)

# plt.show()
# remove all the ticks and directly label each bar with respective value
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

# plt.show()

# direct label each bar with Y axis values
for bari in mybars:
    height = bari.get_height()
    plt.gca().text(bari.get_x() + bari.get_width()/2, bari.get_height()-0.2, str(int(height)),
                 ha='center', color='white', fontsize=15)
plt.show()

1
इसने मेरी समस्या को ठीक कर दिया।
इमाद अगाही

6

जैसा कि मैंने यहां बताया , आप स्टाइल सेटिंग्स (स्टाइल शीट या rcParams) के माध्यम से अपने सभी भूखंडों से रीढ़ को हटा सकते हैं:

import matplotlib as mpl

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False

6

संकट

मुझे कुल्हाड़ियों का उपयोग करने में इसी तरह की समस्या थी। वर्ग पैरामीटर है, frameonलेकिन kwarg है frame_onaxes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

उपाय

frame_on

उदाहरण

data = range(100)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(data)
#ax.set(frameon=False)  # Old
ax.set(frame_on=False)  # New
plt.show()

5

मैं ऐसा करने के लिए उपयोग करता हूं:

from pylab import *
axes(frameon = 0)
...
show()

2

चार्ट के फ्रेम को हटाने के लिए

for spine in plt.gca().spines.values():
  spine.set_visible(False)

मुझे उम्मीद है कि यह काम कर सकता है


1
df = pd.DataFrame({
'client_scripting_ms' : client_scripting_ms,
 'apimlayer' : apimlayer, 'server' : server
}, index = index)

ax = df.plot(kind = 'barh', 
     stacked = True,
     title = "Chart",
     width = 0.20, 
     align='center', 
     figsize=(7,5))

plt.legend(loc='upper right', frameon=True)

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('right')

0
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

चाल चलनी चाहिए।


0
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig के पास अपने आप में वे विकल्प हैं, बस पहले कुल्हाड़ियों को बंद करने की जरूरत है

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