emmet b
Para quitar el marco en la figura, escribo
frameon=False
funciona perfecto con pyplot.figure
pero 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.
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 ax
lo 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
jose kington
En primer lugar, si está utilizando savefig
tenga 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)
(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)
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_adjust
pero 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)
-
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 unTypeError: 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
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
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,
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):
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. 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()
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
¿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