Cómo eliminar el marco de matplotlib (pyplot.figure vs matplotlib.figure) (frameon = Falso Problemático en matplotlib)

Para quitar el marco en la figura, escribo

frameon=False 

Funciona perfectamente con pyplot.figure , pero con matplotlib.Figure . matplotlib.Figure solo elimina el fondo gris, el marco permanece. Además, solo quiero que se muestren las líneas, y todo el rest de la figura sea transparente.

Con pyplot puedo hacer lo que quiero, quiero hacerlo con matplotlib por una larga razón por la que preferiría no mencionar para extender mi pregunta.

En primer lugar, si está usando savefig , tenga en cuenta que anulará el color de fondo de la figura al guardar, a menos que especifique lo contrario (por ejemplo, fig.savefig('blah.png', transparent=True) ).

Sin embargo, para eliminar el fondo de los ejes y la figura en la pantalla, deberás configurar que ax.patch y fig.patch sean invisibles.

P.ej

 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) 

introduzca la descripción de la imagen aquí

(Por supuesto, no puedes ver la diferencia en el fondo blanco de SO, pero todo es transparente …)

Si no desea mostrar nada más que la línea, desactive también el eje utilizando 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) 

introduzca la descripción de la imagen aquí

En ese caso, sin embargo, es posible que desee que los ejes tomen la figura completa. Si especifica manualmente la ubicación de los ejes, puede indicarle que retome la figura completa (alternativamente, puede usar subplots_adjust , pero esto es más sencillo para el caso de un solo eje).

 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) 

introduzca la descripción de la imagen aquí

ax.axis('off') , como Joe Kington señaló, eliminará todo excepto la línea trazada.

Para aquellos que desean eliminar solo el marco (borde) y mantener tags, tickers, etc., uno puede hacerlo accediendo al objeto de spines en el eje. Dado un eje del objeto de eje, lo siguiente debería eliminar los bordes en los cuatro lados:

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

Y, en caso de eliminar las marcas x e y de la ttwig:

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

Construyendo sobre la excelente respuesta de @ peeol , también puedes eliminar el marco haciendo

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

Para dar un ejemplo (el ejemplo de código completo se puede encontrar al final de esta publicación), digamos que tiene un gráfico de barras como este,

introduzca la descripción de la imagen aquí

puede eliminar el marco con los comandos anteriores y luego mantener las tags x- y ytick (gráfica no mostrada) o eliminarlas también haciendo

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

En este caso, uno puede etiquetar las barras directamente; La ttwig final podría verse así (el código se puede encontrar a continuación):

introduzca la descripción de la imagen aquí

Aquí está el código completo que es necesario para generar los gráficos:

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

La forma más fácil de deshacerte del marco feo en las nuevas versiones de matplotlib:

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

Yo uso para hacerlo:

 from pylab import * axes(frameon = 0) ... show() 
 for spine in plt.gca().spines.values(): spine.set_visible(False) #Indentation updated..