Como posso remover os eixos superior e direito do matplotlib?

133

Em vez do estilo de eixo "em caixa" padrão, quero ter apenas os eixos esquerdo e inferior, ou seja:

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

Isso deve ser fácil, mas não consigo encontrar as opções necessárias nos documentos.

Michael Kuhn
fonte

Respostas:

153

Esta é a solução sugerida do Matplotlib 3 no site oficial AQUI :

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()

insira a descrição da imagem aqui

divenex
fonte
2
Essa é a resposta melhor que a aceita nas versões mais recentes do matplotlib.
ffledgling
3
Pergunta adicional para iniciantes: onde você pode encontrar esta resposta com base no documento da API Matplotlib? Se eu for lá: matplotlib.org/api/axes_api.html não vejo nenhuma referência ao spineobjeto e não teria adivinhado essa palavra-chave.
Eric Burel
63

Como alternativa, este

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 conseguir o mesmo efeito em um eixo sem perder o suporte da etiqueta girada.

(Matplotlib 1.0.1; solução inspirada por isso ).

timday
fonte
33

[edit] matplotlib in now (2013-10) na versão 1.3.0, que inclui este

Essa capacidade foi realmente apenas adicionada, e você precisa da versão do Subversion. Você pode ver o código de exemplo aqui .

Estou apenas atualizando para dizer que há um exemplo melhor online agora. Ainda precisamos da versão do Subversion, ainda não houve um lançamento com isso.

[edit] O Matplotlib 0.99.0 RC1 acabou de ser lançado e inclui esse recurso.

Autoplectic
fonte
Certifique-se de ler o aviso em matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… sobre o suporte a marcas de escala estar incompleto antes de tentar usar o acima com etiquetas, por exemplo, giradas!
timday 4/11/11
Parece que depende de como você constrói o eixo. Os eixos gerados por mpl.subplotsnão podem ser usados ​​dessa maneira?
Stefan van der Walt
8
O link de exemplo agora está quebrado.
Mkosmala
10

(Este é mais um comentário de extensão, além das respostas abrangentes aqui.)


Observe que podemos ocultar cada um desses três elementos independentemente um do outro:

  • Para ocultar a borda (também conhecida como "coluna vertebral"): ax.set_frame_on(False)ouax.spines['top'].set_visible(False)

  • Para ocultar os carrapatos: ax.tick_params(top=False)

  • Para ocultar os rótulos: ax.tick_params(labeltop=False)

Evgeni Sergeev
fonte
bom resumo de possibilidades. 1
amado por Jesus,
9

Se você não precisa de carrapatos e coisas do tipo (por exemplo, para plotar ilustrações qualitativas), também pode usar esta solução rápida:

Torne o eixo invisível (por exemplo, com plt.gca().axison = False) e depois desenhe-o manualmente plt.arrow.

Nikow
fonte
1
isso parece remover os espinhos, mas deixa as marcas de escala no lugar. Alguma idéia de como remover os carrapatos também?
Rob Young
2
@ Rob: Você está certo, eu realmente usei uma solução diferente no script que eu estava pensando. Mudei minha resposta, isso agora deve funcionar, mas, em geral, a solução aceita acima é melhor.
Nikow 18/05
9

A biblioteca Seaborn construiu isso com a função despine ().

Basta adicionar:

import seaborn as sns

Agora crie seu gráfico. E adicione no final:

sns.despine()

Se você observar alguns dos valores de parâmetro padrão da função, ela remove a coluna superior e direita e mantém a coluna inferior e esquerda:

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

Confira a documentação adicional aqui: https://seaborn.pydata.org/generated/seaborn.despine.html

Sander van den Oord
fonte
7

Se você precisar removê-lo de todas as suas plotagens, poderá remover espinhos nas configurações de estilo (folha de estilo ou rcParams). Por exemplo:

import matplotlib as mpl

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

Se você deseja remover todos os espinhos:

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
fonte