2010-02-01 11 views
212

Estoy tratando de trazar una figura sin marcas ni números en ninguno de los ejes (utilizo los ejes en el sentido tradicional, ¡no la nomenclatura matplotlib!). Un problema que he encontrado es donde matplotlib ajusta las x (y) etiquetas tick al restar un valor N, luego agrega N al final del eje.Ocultar el texto del eje en los diagramas matplotlib

Esto puede ser vago, pero el siguiente ejemplo simplificado pone de relieve el tema, con '6.18' es 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 el primer lugar (aunque en la mayoría de los casos es útil, no siempre es!) he mirado a través matplotlib.axis.XAxis y no puedo encontrar nada apropiado

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

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

Respuesta

291

En vez 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 establecer las garrapatas a 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() para agregar etiquetas a los ejes.

+1

Hey Ofri - eso es genial, gracias, pero ahora (sólo para ser incómodo) ¿qué sucede si quiero agregar una xlabel()? Aparte de colocar manualmente un widget de texto. – Dave

+0

editado para responder a su pregunta. –

+1

genial - trabaja como se anuncia, gracias! – Dave

141

Si desea ocultar sólo 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([]) 

Haciendo set_visible(False) o set_ticks([]) También habrá ocultar las líneas de cuadrícula.

+4

Un poco tarde, pero mejor que la respuesta aceptada – Floris

+0

esto elimina las etiquetas para * todas las subparcelas que comparten ese eje:/ – endolith

34

Algo de un viejo hilo, pero, esto parece ser un método más rápido utilizando la última versión de matplotlib:

establezca la importante formateador para el eje x

ax.xaxis.set_major_formatter(plt.NullFormatter()) 
+1

¿Qué sucede si solo desea hacerlo por un solo tic? –

+3

Sí, esto es útil para ocultar solo las etiquetas, porque .set_xticks ([]) también elimina las marcas. – zbyszek

12

yo no era realmente capaz para renderizar una imagen sin bordes o datos de ejes basados ​​en cualquiera de los fragmentos de código aquí (incluso el que se acepta en la respuesta). Después de cavar a través de alguna documentación de la API, aterricé en este código para hacer que 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) 

he utilizado la tick_params llamar a cerrar básicamente cualquier información adicional que podría prestarse y tengo un gráfico perfecto en mi archivo de salida:) ¡Espero que esto ayude!

+0

Cuando los ejes se comparten, las soluciones basadas en set_ticklabels se propagan en ejes compartidos. Solo esta solución basada en tick_params estaba funcionando bien para mí. –

41

Si eres como yo y no siempre recuperar los ejes, ax, al trazar la figura, a continuación, una solución sencilla sería hacer

plt.xticks([]) 
plt.yticks([]) 
Cuestiones relacionadas