¿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.

Michael Kuhn
fuente

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í

Divenex
fuente
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 ).

Timday
fuente
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.

Autoplectic
fuente
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)

Evgeni Sergeev
fuente
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.

nikow
fuente
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

Sander van den Oord
fuente
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
hhh
fuente