Cara menghapus bingkai dari matplotlib (pyplot.figure vs matplotlib.figure) (frameon = Salah Bermasalah di matplotlib)

161

Untuk menghapus bingkai dalam gambar, saya menulis

frameon=False

bekerja dengan sempurna pyplot.figure, tetapi dengan matplotlib.Figureitu hanya menghilangkan latar belakang abu-abu, bingkai tetap. Juga, saya hanya ingin garis ditampilkan, dan semua gambar lainnya transparan.

dengan pyplot saya dapat melakukan apa yang saya inginkan, saya ingin melakukannya dengan matplotlib untuk beberapa alasan lama saya lebih suka tidak menyebutkan untuk memperpanjang pertanyaan saya.

Emmet B
sumber
Bisakah Anda mengklarifikasi apa yang Anda lakukan? (Yaitu menunjukkan contoh) Apakah Anda menggunakan savefig? (Jika demikian, itu menimpa apa pun yang Anda atur saat menyimpan angka.) Apakah pengaturan secara manual fig.patch.set_visible(False)berfungsi?
Joe Kington
Saya menggunakan canvas.print_png (respons), bukan savefig.
Emmet B

Jawaban:

178

Pertama, jika Anda menggunakan savefig, ketahuilah bahwa itu akan menimpa warna latar belakang gambar saat menyimpan kecuali Anda menentukan sebaliknya (misalnya fig.savefig('blah.png', transparent=True)).

Namun, untuk menghapus latar belakang sumbu dan gambar di layar, Anda harus mengatur keduanya ax.patchdan fig.patchtidak terlihat.

Misalnya

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)

masukkan deskripsi gambar di sini

(Tentu saja, Anda tidak bisa membedakan antara latar belakang putih SO, tetapi semuanya transparan ...)

Jika Anda tidak ingin menampilkan selain garis, matikan juga poros menggunakan 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)

masukkan deskripsi gambar di sini

Namun, dalam hal itu, Anda mungkin ingin membuat sumbu mengambil angka penuh. Jika Anda secara manual menentukan lokasi sumbu, Anda dapat memerintahkannya untuk mengambil gambar lengkap (secara bergantian, Anda dapat menggunakan subplots_adjust, tetapi ini lebih sederhana untuk kasus sumbu tunggal).

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)

masukkan deskripsi gambar di sini

Joe Kington
sumber
jadi ini memecahkan setengah dari masalah. Tapi saya juga ingin persegi panjang bingkai hitam ini tidak terlihat. Jadi hanya garis biru yang akan terlihat.
Emmet B
5
Oh, well, kalau begitu itu lebih sederhana. Cukup gunakan ax.axis('off')(Anda masih harus mematikan bingkai gambar juga).
Joe Kington
terima kasih, apakah ada cara untuk menjaga ticklabels, seperti: Saya hanya ingin label ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B
Ini hebat, saya menggunakannya untuk aplikasi lain di sini: stackoverflow.com/questions/4092927/…
cxrodgers
1
The print_png()melemparkan TypeError: write() argument must be str, not bytespengecualian bagi saya di python 3. Membuka file sebagai write biner ( 'wb') diperlukan untuk itu untuk bekerja.
Gabriel Jablonski
244

ax.axis('off'), akan seperti yang ditunjukkan Joe Kington, hapus semuanya kecuali garis yang diplot.

Bagi mereka yang ingin hanya menghapus bingkai (perbatasan), dan menyimpan label, tickers dll, orang dapat melakukannya dengan mengakses spinesobjek pada sumbu. Diberikan objek sumbu ax, berikut ini harus menghapus batas di keempat sisi:

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

Dan, dalam hal menghapus xdan ykutu dari plot:

 ax.get_xaxis().set_ticks([])
 ax.get_yaxis().set_ticks([])
peeol
sumber
1
Saya suka ini karena menyingkirkan duri atas dan kanan
Adrian Torrie
5
Hanya untuk menambahkan: Ketika Anda juga ingin menghilangkan kutu: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT
4
Juga, gunakan ax = gca () untuk membuat objek sumbu jika Anda belum memilikinya.
cameronroytaylor
2
Ini harus menjadi jawaban yang diterima. "ax.axis (" off ")" menghapus semuanya seperti: label x dan y, kutu x dan y dan semua (4) berbatasan dengan plot. Untuk kustomisasi yang lebih baik, setiap elemen harus ditangani secara berbeda.
Sanchit
66

Cara termudah untuk menyingkirkan bingkai jelek di versi matplotlib yang lebih baru:

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

Jika Anda benar-benar harus selalu menggunakan pendekatan berorientasi objek, maka lakukan: ax.set_frame_on(False).

neves
sumber
2
Terima kasih! Ini mungkin solusi terbersih!
Kattia
2
Ketika menggunakan pendekatan berorientasi objek, saya berhasil dengan ax.set_frame_on(False), yang melakukan hal yang sama. Mungkin termasuk dalam jawaban di atas.
Floyd4K
58

Membangun jawaban yang sangat bagus dari @ peeol , Anda juga dapat menghapus frame dengan melakukan

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

Untuk memberikan contoh (seluruh contoh kode dapat ditemukan di akhir posting ini), katakanlah Anda memiliki plot bar seperti ini,

masukkan deskripsi gambar di sini

Anda dapat menghapus bingkai dengan perintah di atas dan kemudian menyimpan x-dan yticklabel (plot tidak ditampilkan) atau menghapusnya dengan baik

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

Dalam hal ini, seseorang kemudian dapat memberi label bar secara langsung; plot terakhir dapat terlihat seperti ini (kode dapat ditemukan di bawah):

masukkan deskripsi gambar di sini

Berikut ini seluruh kode yang diperlukan untuk membuat plot:

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()
Cleb
sumber
1
Itu memperbaiki masalah saya.
Emad Aghayi
6

Seperti yang saya jawab di sini , Anda dapat menghapus duri dari semua plot Anda melalui pengaturan gaya (style sheet atau 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
hhh
sumber
6

Masalah

Saya memiliki masalah yang sama menggunakan kapak. Parameter kelas hanyalah frameonkwarg frame_on. axes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Larutan

frame_on

Contoh

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()
A. Barat
sumber
5

Saya biasa melakukannya:

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

Untuk menghapus bingkai grafik

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

Saya harap ini bisa berhasil

Shabeeh Shakkir
sumber
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')
Taha Kaiyum
sumber
0
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

harus melakukan trik.

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

plt.savefig memiliki opsi-opsi itu sendiri, hanya perlu mematikan sumbu sebelumnya

mohammad ess
sumber