Come rimuovere frame da matplotlib (pyplot.figure vs matplotlib.figure) (frameon = False Problematic in matplotlib)


161

Per rimuovere la cornice in figura, scrivo

frameon=False

funziona perfettamente pyplot.figure, ma con matplotlib.Figureesso rimuove solo lo sfondo grigio, la cornice rimane. Inoltre, voglio solo mostrare le linee e tutto il resto della figura deve essere trasparente.

con pyplot posso fare quello che voglio, voglio farlo con matplotlib per qualche lungo motivo che preferirei non menzionare per estendere la mia domanda.


Puoi chiarire cosa stai facendo? (es. mostra un esempio) Stai usando savefig? (In tal caso, sovrascrive tutto ciò che viene impostato durante il salvataggio della figura.) L'impostazione manuale fig.patch.set_visible(False)funziona?
Joe Kington,

Uso canvas.print_png (risposta), non savefig.
Emmet B,

Risposte:


178

Prima di tutto, se stai utilizzando savefig, tieni presente che sovrascriverà il colore di sfondo della figura durante il salvataggio, a meno che non specifichi diversamente (ad esempio fig.savefig('blah.png', transparent=True)).

Tuttavia, per rimuovere sullo schermo gli assi e lo sfondo della figura, dovrai impostare sia ax.patchefig.patch essere invisibile.

Per esempio

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)

inserisci qui la descrizione dell'immagine

(Certo, non puoi dire la differenza sullo sfondo bianco di SO, ma tutto è trasparente ...)

Se non vuoi mostrare altro che la linea, disattiva anche l'asse usando 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)

inserisci qui la descrizione dell'immagine

In tal caso, tuttavia, potresti voler fare in modo che gli assi occupino l'intera figura. Se specifichi manualmente la posizione degli assi, puoi dire che occupa l'intera figura (in alternativa, puoi usare subplots_adjust, ma questo è più semplice per il caso di un singolo asse).

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)

inserisci qui la descrizione dell'immagine


quindi questo risolve metà del problema. Ma voglio anche che questo rettangolo di cornice nera sia invisibile. Quindi dovrebbe essere visibile solo la linea blu.
Emmet B,

5
Oh, beh, in quel caso è ancora più semplice. Basta usare ax.axis('off')(sarà comunque necessario disattivare anche la cornice della figura).
Joe Kington,

grazie, c'è un modo per mantenere i segni di spunta, come ad esempio: Voglio solo etichette ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B,

Questo è grande, l'ho usato per un'altra applicazione qui: stackoverflow.com/questions/4092927/...
cxrodgers

1
La print_png()lancia un TypeError: write() argument must be str, not byteseccezione per me su Python 3. L'apertura del file come binario write ( 'wb') è necessario per farlo funzionare.
Gabriel Jablonski,

244

ax.axis('off'), come ha sottolineato Joe Kington, rimuoverà tutto tranne la linea tracciata.

Per coloro che vogliono rimuovere solo la cornice (bordo) e mantenere etichette, ticker ecc., Si può farlo accedendo spinesall'oggetto sull'asse. Dato un oggetto asse ax, quanto segue dovrebbe rimuovere i bordi su tutti e quattro i lati:

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

E, in caso di rimozione xe ysegni di spunta dalla trama:

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

1
Mi piace questo per sbarazzarsi della spina
dorsale

5
Solo per aggiungere: quando si desidera rimuovere anche i segni di ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
spunta

4
Inoltre, usa ax = gca () per creare un oggetto asse se non ne hai già uno.
Cameronroytaylor,

2
Questa dovrebbe essere la risposta accettata. "ax.axis (" off ")" rimuove tutto come: etichette x e y, segni di spunta xey e tutti i bordi (4) dalla trama. Per una migliore personalizzazione, ogni elemento deve essere gestito in modo diverso.
Sanchit,

66

Il modo più semplice per sbarazzarsi della brutta cornice nelle nuove versioni di matplotlib:

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

Se davvero si deve sempre utilizzare l'approccio orientato agli oggetti, poi fare: ax.set_frame_on(False).


2
Grazie! Questa è probabilmente la soluzione più pulita!
Kattia,

2
Quando ho usato l'approccio orientato agli oggetti, ho avuto successo ax.set_frame_on(False), il che fa la stessa cosa. Forse includi nella risposta sopra.
Floyd4K,

58

Costruire sulla @ risposta eccellente del peeol , è anche possibile rimuovere il telaio facendo

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

Per fare un esempio (l'intero esempio di codice può essere trovato alla fine di questo post), supponiamo che tu abbia un grafico a barre come questo,

inserisci qui la descrizione dell'immagine

puoi rimuovere la cornice con i comandi sopra e quindi mantenere le etichette x-e ytick(trama non mostrata) o rimuoverle

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

In questo caso, si possono quindi etichettare direttamente le barre; la trama finale potrebbe apparire così (il codice può essere trovato sotto):

inserisci qui la descrizione dell'immagine

Ecco l'intero codice necessario per generare i grafici:

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
Ha risolto il mio problema.
Emad Aghayi,

6

Come ho risposto qui , puoi rimuovere le spine da tutte le tue trame attraverso le impostazioni di stile (foglio di stile o 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

Problema

Ho avuto un problema simile usando gli assi. Il parametro class è frameonma il kwarg lo è frame_on. axes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Soluzione

frame_on

Esempio

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

Lo faccio per fare questo:

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

2

Per rimuovere la cornice del grafico

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

Spero che possa funzionare


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

dovrebbe fare il trucco.


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

plt.savefig ha queste opzioni in sé, è sufficiente disattivare gli assi prima

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.