¿Cómo puedo eliminar los ejes superior y derecho en matplotlib?


133

En lugar del estilo de eje "en caja" predeterminado, quiero tener solo el eje izquierdo y el inferior, es decir:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

Esto debería ser fácil, pero no puedo encontrar las opciones necesarias en los documentos.

Respuestas:


153

Esta es la solución sugerida de Matplotlib 3 del sitio web oficial AQUÍ :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

ingrese la descripción de la imagen aquí


2
Esta es la respuesta mejor que la aceptada en las versiones más recientes de matplotlib.
ffledgling

3
Pregunta adicional para principiantes: ¿dónde puede encontrar esta respuesta basada en el documento API de Matplotlib? Si voy allí: matplotlib.org/api/axes_api.html No veo ninguna referencia al spineobjeto, y no habría adivinado esta palabra clave.
Eric Burel el

63

Alternativamente, esto

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

parece lograr el mismo efecto en un eje sin perder el soporte rotulado de la etiqueta.

(Matplotlib 1.0.1; solución inspirada en esto ).


33

[edit] matplotlib ahora (2013-10) en la versión 1.3.0 que incluye esto

Esa habilidad en realidad se acaba de agregar, y necesitas la versión de Subversion para ello. Puedes ver el código de ejemplo aquí .

Solo estoy actualizando para decir que hay un mejor ejemplo en línea ahora. Sin embargo, todavía necesito la versión de Subversion, no ha habido un lanzamiento con esto todavía.

[editar] Matplotlib 0.99.0 RC1 acaba de ser lanzado e incluye esta capacidad.


Asegúrese de leer la advertencia en matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… acerca de que el soporte de marca de verificación está incompleto antes de intentar y usar lo anterior con, por ejemplo, etiquetas rotadas.
Lunes

Parece que depende de cómo construyas el eje. ¿Los ejes generados por mpl.subplotsno se pueden usar de esta manera?
Stefan van der Walt

8
El enlace de ejemplo ahora está roto.
mkosmala

10

(Esto es más un comentario de extensión, además de las respuestas completas aquí).


Tenga en cuenta que podemos ocultar cada uno de estos tres elementos independientemente uno del otro:

  • Para ocultar el borde (también conocido como "columna vertebral"): ax.set_frame_on(False)oax.spines['top'].set_visible(False)

  • Para ocultar las garrapatas: ax.tick_params(top=False)

  • Para ocultar las etiquetas: ax.tick_params(labeltop=False)


Buen resumen de posibilidades. +1
loved.by.Jesus

9

Si no necesita ticks y demás (por ejemplo, para trazar ilustraciones cualitativas), también puede usar esta solución rápida:

Haga que el eje sea invisible (por ejemplo, con plt.gca().axison = False) y luego dibuje manualmente con plt.arrow.


1
Esto parece eliminar las espinas, pero deja las marcas en su lugar. ¿Alguna idea de cómo quitar las garrapatas también?
Rob Young

2
@Rob: Tienes razón, en realidad utilicé una solución diferente en el script en el que estaba pensando. Cambié mi respuesta, esto debería funcionar ahora, pero en general la solución aceptada arriba es mejor.
nikow

9

Library Seaborn tiene esto incorporado con la función despine ().

Solo agrega:

import seaborn as sns

Ahora crea tu gráfico. Y agregue al final:

sns.despine()

Si observa algunos de los valores de parámetros predeterminados de la función, elimina la columna superior y derecha y mantiene la columna inferior y la izquierda:

sns.despine(top=True, right=True, left=False, bottom=False)

Consulte más documentación aquí: https://seaborn.pydata.org/generated/seaborn.despine.html


7

Si necesita eliminarlo de todas sus parcelas, puede eliminar las espinas en la configuración de estilo (hoja de estilo o rcParams). P.ej:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Si desea eliminar todas las espinas:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.