Ocultando o texto do eixo em gráficos matplotlib

370

Estou tentando plotar uma figura sem marcas de seleção ou números em qualquer um dos eixos (eu uso eixos no sentido tradicional, não na nomenclatura matplotlib!). Um problema que me deparei é que o matplotlib ajusta os tickl x x subtraindo um valor N e depois adiciona N no final do eixo.

Isso pode ser vago, mas o exemplo simplificado a seguir destaca o problema, com '6.18' sendo o 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()

As três coisas que eu gostaria de saber são:

  1. Como desativar esse comportamento em primeiro lugar (embora na maioria dos casos seja útil, nem sempre é!) Examinei matplotlib.axis.XAxise não consigo encontrar nada apropriado

  2. Como posso fazer N desaparecer (ie X.set_visible(False))

  3. Existe uma maneira melhor de fazer o que precede de qualquer maneira? Meu gráfico final seria subtramas 4x4 em uma figura, se isso for relevante.

Dave
fonte
Tenho uma dúvida se alguma das respostas aqui realmente responde à pergunta. Para mim, parece que a pergunta pergunta como se livrar da compensação . No entanto, todas as respostas mostram várias maneiras de como se livrar de todos os ticklabels. Se a pergunta foi substituída pelas respostas, talvez alguém deva editar a pergunta para perguntar para que as respostas fornecem soluções?
ImportanceOfBeingErnest

Respostas:

471

Em vez de ocultar cada elemento, você pode ocultar todo o eixo:

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

Ou, você pode definir os ticks para uma lista vazia:

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

Nesta segunda opção, você ainda pode usar plt.xlabel()e plt.ylabel()adicionar etiquetas aos eixos.

Ofri Raviv
fonte
2
Ei, Ofri - isso é ótimo, obrigado, mas agora (só para ser embaraçoso) o que acontece se eu quiser adicionar um xlabel ()? Além de colocar manualmente um widget de texto.
Dave
5
Como você pode estender este exemplo para 3d? ax = plt.gca (projeção = '3d'), ax.axes.get_zaxis () set_visible (Falso) dá.'Axes3DSubplot' object has no attribute 'get_zaxis'
user989762
13
Esta resposta não permite que linhas de grade sejam exibidas. A resposta de @saullo castro faz ...
evan54
O problema é que quando o X_AXIS está definido para invisível, o dsappears grade :( Edit: Só vi a resposta de @Saullo Castro, que corrigiu o problema.
Shailen
11
@ user989762 No seu caso, este método não funciona, nem mesmo get_xaxis().set_visible(False). Eu acho que o matplotlib, nesse caso, inicializa alguns parâmetros como se o gráfico fosse 2D. ax.set_zticks([])vai fazer o que quiser
psych kon
222

Se você deseja ocultar apenas o texto do eixo, mantendo as linhas da grade:

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

Fazer set_visible(False)ou set_ticks([])também ocultará as linhas de grade.

Saullo GP Castro
fonte
4
isso exclui os rótulos de todas as subparcelas que compartilham esse eixo: /
endolith
136

Se você é como eu e nem sempre recupera os eixos ax, ao traçar a figura, uma solução simples seria:

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

Um pouco de um thread antigo, mas parece ser um método mais rápido usando a versão mais recente do matplotlib:

defina o formatador principal para o eixo x

ax.xaxis.set_major_formatter(plt.NullFormatter())
Nik Twerdochlib
fonte
11
E se você quiser fazer isso apenas para um único tick?
21415 Tommy.carstensen
5
Sim, isso é útil apenas para ocultar os rótulos, porque .set_xticks ([]) também remove as próprias marcas de escala.
precisa saber é o seguinte
49

Na verdade, não consegui renderizar uma imagem sem bordas ou dados de eixo com base em nenhum dos trechos de código aqui (mesmo aquele aceito na resposta). Depois de pesquisar em alguma documentação da API, cheguei nesse código para renderizar minha imagem

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)

Eu usei a tick_paramschamada para desligar basicamente qualquer informação extra que possa ser renderizada e eu tenho um gráfico perfeito no meu arquivo de saída.

GingerLoaf
fonte
11
Quando os eixos são compartilhados, as soluções baseadas em set_ticklabels se propagam em eixos compartilhados. Somente esta solução baseada em tick_params estava funcionando bem para mim.
Christian O'Reilly
39

Eu codifiquei esta figura em cores para facilitar o processo.

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

insira a descrição da imagem aqui

Você pode ter controle total sobre a figura usando estes comandos, para concluir a resposta, adicionei também o controle sobre os 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
fonte
ax.set_xticklabels([])e ax.set_xticks([])não funcionou para mim, mas ax.axes.get_xaxis().set_visible(False)funcionou.
Homero Esmeraldo
2
esta deve ser a resposta aceita
Jason S
6

Ao usar a API orientada a objetos, o Axesobjeto possui dois métodos úteis para remover o texto do eixo set_xticklabels()e set_xticks().

Digamos que você crie um gráfico usando

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

Se você simplesmente deseja remover os rótulos de escala, você pode usar

ax.set_xticklabels([])

ou para remover completamente os carrapatos, você pode usar

ax.set_xticks([])

Esses métodos são úteis para especificar exatamente onde você deseja os ticks e como deseja que eles sejam rotulados. Passar uma lista vazia resulta em carrapatos ou rótulos, respectivamente.

Steven C. Howell
fonte
2

Um truque pode ser definir a cor dos rótulos dos carrapatos como brancos para ocultá-los!

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