Çerçeve matplotlib'den nasıl kaldırılır (pyplot.figure vs matplotlib.figure) (frameon = matplotlib'de Yanlış Sorunlu)


161

Şekildeki çerçeveyi çıkarmak için yazıyorum

frameon=False

ile mükemmel çalışır pyplot.figure, ancak matplotlib.Figuresadece gri arka planı kaldırır, çerçeve kalır. Ayrıca, sadece çizgilerin gösterilmesini istiyorum ve şeklin geri kalanının tamamı şeffaf.

pyplot ile istediğimi yapabilirim, uzun bir nedenden ötürü matplotlib ile yapmak istiyorum sorumu uzatmak için bahsetmiyorum.


Ne yaptığınızı açıklığa kavuşturabilir misiniz? (örn. bir örnek göster) Kullanıyor musunuz savefig? (Öyleyse, şekil kaydedilirken ayarladığınız her şeyi geçersiz kılar.) Manuel ayar fig.patch.set_visible(False)çalışıyor mu?
Joe Kington

Savefig değil canvas.print_png (yanıt) kullanıyorum.
Emmet B

Yanıtlar:


178

İlk olarak, kullanıyorsanız savefig, aksi belirtilmedikçe, kaydederken şeklin arka plan rengini geçersiz kılacağını unutmayın (örn. fig.savefig('blah.png', transparent=True)).

Ancak ekranda eksenleri ve şeklin arka planını kaldırmak için, ikisini birden ayarlamanız ax.patchve fig.patchgörünmez olmanız gerekir.

Örneğin

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)

resim açıklamasını buraya girin

(Tabii ki, SO'nun beyaz arka planındaki farkı söyleyemezsiniz, ancak her şey şeffaftır ...)

Çizgi dışında bir şey göstermek istemiyorsanız, ekseni aşağıdakileri kullanarak da kapatın 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)

resim açıklamasını buraya girin

Bu durumda, eksenlerin tam rakamı almasını isteyebilirsiniz. Eksenlerin konumunu manuel olarak belirlerseniz, tam rakamı almasını söyleyebilirsiniz (alternatif olarak kullanabilirsiniz subplots_adjust, ancak bu tek eksenler için daha basittir).

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)

resim açıklamasını buraya girin


bu da sorunun yarısını çözer. Ama aynı zamanda bu siyah çerçeve dikdörtgenin görünmez olmasını istiyorum. Bu yüzden sadece mavi çizgi görünmelidir.
Emmet B

5
Oh, bu durumda daha da basit. Sadece kullanın ax.axis('off')(şekil çerçevesini de kapatmanız gerekir).
Joe Kington

teşekkürler, ticklabels tutmak için bir yolu var, gibi: Ben sadece etiketleri istiyorum ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B

Bu harika, burada başka bir uygulama için kullandım: stackoverflow.com/questions/4092927/…
cxrodgers

1
print_png()Bir atar TypeError: write() argument must be str, not bytesyazma ikili olarak dosya (Açılış piton 3. benim için istisna 'wb'çalışmalarına bunun için tabi).
Gabriel Jablonski

244

ax.axis('off'), Joe Kington'un işaret ettiği gibi, çizilen çizgi hariç her şeyi kaldırın.

Yalnızca çerçeveyi (kenarlığı) kaldırmak ve etiketleri, işaretçileri vb. Tutmak isteyenler için spines, eksendeki nesneye erişerek bunu yapabilirsiniz . Bir eksen nesnesi verildiğinde ax, aşağıdakiler dört taraftaki kenarlıkları da kaldırmalıdır:

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

Ve, arsadan çıkarma xve ykeneler durumunda :

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

1
Üst ve sağ dikenlerden kurtulmak için bunu seviyorum
Adrian Torrie

5
Sadece eklemek için: Keneleri de kaldırmak istediğinizde: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT

4
Ayrıca, henüz yoksa bir eksen nesnesi oluşturmak için ax = gca () kullanın.
cameronroytaylor

2
Bu kabul edilen cevap olmalı. "ax.axis (" off ")", x ve y etiketleri, x ve y keneleri ve tüm (4) sınırları çizimden kaldırır. Daha iyi özelleştirme için, her eleman farklı şekilde ele alınmalıdır.
Sanchit

66

Matplotlib'in yeni sürümlerinde çirkin çerçeveden kurtulmanın en kolay yolu:

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

Eğer gerçekten her zaman nesne yönelimli yaklaşım kullanmanız gerekiyorsa, o zaman yapın: ax.set_frame_on(False).


2
Teşekkür ederim! Bu muhtemelen en temiz çözüm!
Kattia

2
Nesneye yönelik yaklaşımı kullanırken ax.set_frame_on(False), aynı şeyi yapan başarılı oldum . Belki yukarıdaki cevaba ekleyiniz.
Floyd4K

58

Üzerinde inşa peeol mükemmel cevap @ , ayrıca yaparak çerçeveyi kaldırabilirsiniz

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

Bir örnek vermek gerekirse (kod örneğinin tamamı bu yazının sonunda bulunabilir), diyelim ki böyle bir çubuk grafiğiniz var,

resim açıklamasını buraya girin

yukarıdaki komutlarla çerçeveyi kaldırabilir ve ardından x-ve yticketiketlerini saklayabilirsiniz (çizim gösterilmemiştir) veya bunları kaldırarak da kaldırabilirsiniz.

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

Bu durumda, çubuklar doğrudan etiketlenebilir; son çizim şöyle görünebilir (kod aşağıda bulunabilir):

resim açıklamasını buraya girin

Çizimleri oluşturmak için gerekli olan kodun tamamı şunlardır:

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
Sorunumu düzeltti.
Emad Aghayi

6

Ben cevap olarak burada , stil ayarları aracılığıyla tüm parsellerden dikenleri (stil sayfası veya rcParams) kaldırabilirsiniz:

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

Sorun

Eksen kullanırken de benzer bir sorun yaşadım. Class parametresi frameonancak kwarg frame_on. axes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Çözüm

frame_on

Misal

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

Bunu yapmak için kullanın:

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

2

Grafiğin çerçevesini kaldırmak için

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

Umarım bu işe yarayabilir


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

hile yapmalı.


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

plt.savefig kendi içinde bu seçeneklere sahip, sadece önce eksenleri ayarlamanız gerekiyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.