Cómo quitar el marco de una figura

7 minutos de lectura

Avatar de usuario de Emmet B.
emmet b

Para quitar el marco en la figura, escribo

frameon=False

funciona perfecto con pyplot.figurepero con matplotlib.Figure solo quita el fondo gris, el marco se queda. Además, solo quiero que se muestren las líneas y que el resto de la figura sea transparente.

con pyplot puedo hacer lo que quiera, quiero hacerlo con matplotlib por alguna larga razón que prefiero no mencionar para extender mi pregunta.

  • ¿Puedes aclarar lo que estás haciendo? (es decir, muestra un ejemplo) ¿Estás usando savefig? (Si es así, anula lo que establezca al guardar la figura). fig.patch.set_visible(False) ¿trabajar?

    –Joe Kington

    16 de febrero de 2013 a las 17:31

  • Uso canvas.print_png (respuesta), no savefig.

    – Emmet B.

    16 de febrero de 2013 a las 17:48

avatar de usuario de igr
igr

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

Para aquellos que solo desean eliminar el marco (borde) y mantener etiquetas, teletipos, etc., pueden hacerlo accediendo a la spines objeto en el eje. Dado un objeto de eje axlo siguiente debe 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 x y y garrapatas de la trama:

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

  • Me gusta esto para deshacerme de las espinas superior y derecha.

    – Adrián Torrie

    28 de octubre de 2016 a las 6:20

  • Solo para agregar: cuando también desea eliminar las marcas: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')

    – JLT

    5 de enero de 2017 a las 13:01


  • Además, use ax=gca() para crear un objeto de eje si aún no tiene uno.

    – cameronroytaylor

    31 de marzo de 2017 a las 19:45

  • Esta debería ser la respuesta aceptada. “ax.axis(“off”)” elimina todo como: etiquetas x e y, marcas x e y y todos los (4) bordes del gráfico. Para una mejor personalización, cada elemento debe manejarse de manera diferente.

    – Sanchit

    9 de noviembre de 2017 a las 11:25

  • Esto es exactamente lo que necesitaba. Bonitas tramas, aquí vengo.

    – EA304GT

    31 de mayo a las 17:59

Avatar de usuario de Joe Kington
jose kington

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

Sin embargo, para eliminar el fondo de las hachas y las figuras en la pantalla, deberá configurar ambos ax.patch y fig.patch ser invisible

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)

ingrese la descripción de la imagen aquí

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

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

ingrese la descripción de la imagen aquí

Sin embargo, en ese caso, es posible que desee hacer que los ejes ocupen la figura completa. Si especifica manualmente la ubicación de los ejes, puede indicarle que ocupe la figura completa (alternativamente, puede usar subplots_adjustpero esto es más simple 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)

ingrese la descripción de la imagen aquí

  • así que esto resuelve la mitad del problema. Pero también quiero que este rectángulo de marco negro sea invisible. Entonces solo la línea azul debería ser visible.

    – Emmet B.

    16 de febrero de 2013 a las 18:07


  • Oh, bueno, en ese caso es aún más simple. Solo usa ax.axis('off') (aún deberá apagar el marco de la figura también).

    –Joe Kington

    16 de febrero de 2013 a las 20:18

  • gracias, ¿hay alguna manera de mantener ticklabels, como: solo quiero etiquetas ax.set_yticklabels(('G1', 'G2', 'G3'))

    – Emmet B.

    17 de febrero de 2013 a las 9:43


  • Esto es genial, lo usé para otra aplicación aquí: stackoverflow.com/questions/4092927/…

    – cxrodgers

    08/04/2015 a las 21:19

  • El print_png() lanza un TypeError: write() argument must be str, not bytes excepción para mí en python 3. Abriendo el archivo como escritura binaria ('wb') es necesario para que funcione.

    –Gabriel Jablonski

    3 de noviembre de 2019 a las 22:18


avatar de usuario de neves
neves

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

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

Si realmente debe usar siempre el enfoque orientado a objetos, entonces haga lo siguiente: ax.set_frame_on(False).

  • Al usar el enfoque orientado a objetos, tuve éxito con ax.set_frame_on(False), que hace lo mismo. Tal vez incluir en la respuesta anterior.

    – Floyd4K

    1 oct 2019 a las 16:15


  • Esto elimina todo el cuadro/rectángulo, no solo el marco/los bordes. Puede o no ser lo que quieres.

    – ponerse8

    25 de enero de 2021 a las 6:18

  • Y para ocultar solo las líneas superior y derecha, la solución está aquí.

    – minutos

    21 oct 2022 a las 9:29


Avatar de usuario de Cleb
clave

Sobre la base de la excelente respuesta de @peeol, también puede eliminar el marco haciendo

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

Para dar un ejemplo (la muestra de código completa se puede encontrar al final de esta publicación), supongamos que tiene un gráfico de barras como este,

ingrese la descripción de la imagen aquí

puede eliminar el marco con los comandos anteriores y luego mantener el x- y ytick etiquetas (gráfico no mostrado) o eliminarlas también haciendo

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

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

ingrese la descripción de la imagen aquí

Aquí está el código completo que es necesario para generar las parcelas:

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

Como respondí aquí, puede eliminar las espinas de todos sus gráficos a través de la configuración de estilo (hoja de estilo 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

A. Avatar de usuario de West
A. Oeste

Problema

Tuve un problema similar al usar ejes. El parámetro de clase es frameon pero el kwarg es frame_on. ejes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Solución

frame_on

Ejemplo

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

avatar de usuario de petezurich
petezurich

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

  • NameError: name 'client_scripting_ms' is not defined

    – EA304GT

    31 de mayo a las 17:57

¿Ha sido útil esta solución?