Ocultar texto del eje en diagramas matplotlib

370

Estoy tratando de trazar una figura sin marcas de verificación o números en cualquiera de los ejes (¡uso ejes en el sentido tradicional, no la nomenclatura matplotlib!). Un problema con el que me he encontrado es cuando matplotlib ajusta las marcas de verificación x (y) restando un valor N, luego agrega N al final del eje.

Esto puede ser vago, pero el siguiente ejemplo simplificado resalta el problema, siendo '6.18' el valor ofensivo de N:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

Las tres cosas que me gustaría saber son:

  1. Cómo desactivar este comportamiento en primer lugar (aunque en la mayoría de los casos es útil, ¡no siempre es así!) He examinado matplotlib.axis.XAxisy no puedo encontrar nada apropiado

  2. ¿Cómo puedo hacer que N desaparezca (es decir X.set_visible(False))

  3. ¿Hay una mejor manera de hacer lo anterior de todos modos? Mi trama final sería subtramas 4x4 en una figura, si eso es relevante.

Dave
fuente
Tengo una pequeña duda si alguna de las respuestas aquí realmente responde la pregunta. Para mí, parece que la pregunta pregunta cómo deshacerse del desplazamiento . Sin embargo, todas las respuestas muestran varias formas de deshacerse de todas las etiquetas. Si la pregunta ha sido reemplazada por las respuestas, ¿tal vez uno debería editar la pregunta para preguntar para qué las respuestas proporcionan soluciones?
ImportanceOfBeingErnest

Respuestas:

471

En lugar de ocultar cada elemento, puede ocultar todo el eje:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

O bien, puede configurar los ticks en una lista vacía:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

En esta segunda opción, aún puede usar plt.xlabel()y plt.ylabel()agregar etiquetas a los ejes.

Ofri Raviv
fuente
2
Hola Ofri, eso es genial, gracias, pero ahora (solo para ser incómodo) ¿qué sucede si quiero agregar una etiqueta x ()? Aparte de colocar manualmente un widget de texto.
Dave
55
¿Cómo puedes extender este ejemplo a 3d? ax = plt.gca (proyección = '3d'), ax.axes.get_zaxis (). set_visible (False) da'Axes3DSubplot' object has no attribute 'get_zaxis'
usuario989762
13
Esta respuesta no permite mostrar líneas de cuadrícula. La respuesta de @saullo castro sí ...
evan54
El problema es que cuando x_axis se establece en invisible, aparece la cuadrícula :( Editar: Acabo de ver la respuesta de @Saullo Castro que solucionó el problema.
Shailen
1
@ user989762 En su caso, este método no funcionará, ni siquiera get_xaxis().set_visible(False). Creo que matplotlib en este caso inicializa algunos parámetros como si el gráfico fuera 2D. ax.set_zticks([])hará lo que quieras
kon psych
222

Si desea ocultar solo el texto del eje manteniendo las líneas de la cuadrícula:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

Hacer set_visible(False)o set_ticks([])también ocultará las líneas de la cuadrícula.

Saullo GP Castro
fuente
44
esto elimina las etiquetas de todas las subtramas que comparten ese eje: /
endolith
136

Si eres como yo y no siempre recuperas los ejes ax, al trazar la figura, entonces una solución simple sería hacer

plt.xticks([])
plt.yticks([])
Ébe Isaac
fuente
56

Algo así como un hilo antiguo, pero este parece ser un método más rápido con la última versión de matplotlib:

establecer el formateador principal para el eje x

ax.xaxis.set_major_formatter(plt.NullFormatter())
Nik Twerdochlib
fuente
1
¿Qué pasa si solo quieres hacerlo por una sola marca?
tommy.carstensen
55
Sí, esto es útil para ocultar solo las etiquetas, porque .set_xticks ([]) también elimina las marcas de verificación.
zbyszek
49

En realidad, no pude renderizar una imagen sin bordes o datos de eje basados ​​en ninguno de los fragmentos de código aquí (incluso el aceptado en la respuesta). Después de buscar en la documentación de la API, llegué a este código para representar mi imagen

plt.axis('off')
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

tick_paramsBásicamente, utilicé la llamada para cerrar cualquier información adicional que pudiera presentarse y tengo un gráfico perfecto en mi archivo de salida.

GingerLoaf
fuente
1
Cuando se comparten ejes, las soluciones basadas en set_ticklabels se propagan en ejes compartidos. Solo esta solución basada en tick_params estaba funcionando bien para mí.
Christian O'Reilly
39

He codificado por colores esta figura para facilitar el proceso.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

ingrese la descripción de la imagen aquí

Puede tener control total sobre la figura usando estos comandos, para completar la respuesta también he agregado el control sobre las splines:

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

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)
GM
fuente
ax.set_xticklabels([])y ax.set_xticks([])no funcionó para mí, pero lo ax.axes.get_xaxis().set_visible(False)hizo.
Homero Esmeraldo
2
esta debería ser la respuesta aceptada
Jason S
6

Cuando se utiliza la API orientada a objetos, el Axesobjeto tiene dos métodos útiles para eliminar el texto del eje, set_xticklabels()y set_xticks().

Digamos que creas una trama usando

fig, ax = plt.subplots(1)
ax.plot(x, y)

Si simplemente desea eliminar las etiquetas de marca, puede usar

ax.set_xticklabels([])

o para eliminar las garrapatas por completo, puedes usar

ax.set_xticks([])

Estos métodos son útiles para especificar exactamente dónde quiere los ticks y cómo quiere que se etiqueten. Al pasar una lista vacía, no hay marcas ni etiquetas, respectivamente.

Steven C. Howell
fuente
2

¡Un truco podría ser configurar el color de las etiquetas de marca como blanco para ocultarlo!

plt.xticks(color='w')
plt.yticks(color='w')
Venkatachalam
fuente