Estou tentando corrigir como python plota meus dados.
Dizer
x = [0,5,9,10,15]
e
y = [0,1,2,3,4]
Então eu faria:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
e os ticks do eixo x são plotados em intervalos de 5. Existe uma maneira de mostrar intervalos de 1?
python
matplotlib
Dax Feliz
fonte
fonte
pyplot.locator_params(nbins=4)
Respostas:
Você pode definir explicitamente onde deseja marcar as marcas
plt.xticks
:Por exemplo,
(
np.arange
foi usada em vez darange
função do Python apenas por precauçãomin(x)
emax(x)
são flutuadores em vez de ints.)A função
plt.plot
(ouax.plot
) definirá automaticamente o padrãox
e osy
limites. Se você deseja manter esses limites e apenas alterar o tamanho das etapas das marcas de escala, poderáax.get_xlim()
descobrir quais limites o Matplotlib já definiu.O formatador de ticks padrão deve fazer um trabalho decente, arredondando os valores de ticks para um número razoável de dígitos significativos. No entanto, se você deseja ter mais controle sobre o formato, pode definir seu próprio formatador. Por exemplo,
Aqui está um exemplo executável:
fonte
+1
noplt.xticks(np.arange(min(x), max(x)+1, 1.0))
é necessário para mostrar a última marca de escala.np.arange(start, stop)
gera valores no intervalo semiaberto[start, stop)
, incluindostart
mas excluindostop
. Então, eu costumavamax(x)+1
garantir que issomax(x)
está incluído.plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)
? parece traçar apenas o anoOutra abordagem é definir o localizador de eixos:
Existem vários tipos diferentes de localizador, dependendo de suas necessidades.
Aqui está um exemplo completo:
fonte
matplotlib.dates.AutoDateLocator()
base=1.0
realmente significa / faz?Gosto desta solução (do Matplotlib Plotting Cookbook ):
Esta solução fornece controle explícito do espaçamento dos ticks através do número indicado
ticker.MultipleLocater()
, permite a determinação automática de limites e é fácil de ler posteriormente.fonte
Caso alguém esteja interessado em uma única linha geral, basta obter os ticks atuais e usá-lo para definir os novos ticks, amostrando todos os outros ticks.
fonte
ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
Isso é um pouco hacky, mas de longe o exemplo mais limpo / fácil de entender que eu encontrei para fazer isso. É de uma resposta no SO aqui:
A maneira mais limpa de ocultar todos os enésimos rótulos de marcadores na barra de cores matplotlib?
Em seguida, você pode fazer um loop sobre os rótulos, definindo-os como visíveis ou não, dependendo da densidade desejada.
edit: note que, às vezes, o matplotlib define rótulos ==
''
, portanto, pode parecer que um rótulo não está presente, quando na verdade está e simplesmente não está exibindo nada. Para garantir que você esteja percorrendo rótulos visíveis reais, tente:fonte
ax.get_xticklabels()[1::2]
os rótulos ficam ocultos.''
que, quando você os percorra, os xticklabels estejam vazios invisíveis (o que não teria efeito na visualização, mas pode significar que você não está puxando os rótulos corretos). Você pode tentar:vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
Este é um tópico antigo, mas tropeço nele de vez em quando e faço essa função. É muito conveniente:
Uma ressalva de controlar os ticks dessa maneira é que não se desfruta mais da atualização automagic interativa da escala máxima após uma linha adicionada. Então faça
e execute a função de reajuste novamente.
fonte
Eu desenvolvi uma solução deselegante. Considere que temos o eixo X e também uma lista de rótulos para cada ponto em X.
Exemplo: Digamos que eu queira mostrar marcadores de ticks apenas para 'feb' e 'jun' Bom, agora temos uma lista falsa de etiquetas. Primeiro, plotamos a versão original. Agora, a versão modificada.fonte
se você quiser apenas definir o espaçamento como um liner simples, com um mínimo de clichê:
também funciona facilmente para pequenos ticks:
um pouco de boca cheia, mas bastante compacto
fonte
Isso funcionou para mim
se você quiser carrapatos entre [1,5] (1 e 5 inclusive), substitua
fonte
xmarks = range(1, length+1, 1)
. tenho certeza que a compreensão da lista é redundante.Implementação Pure Python
Abaixo está uma implementação python pura da funcionalidade desejada que lida com qualquer série numérica (int ou float) com valores positivos, negativos ou mistos e permite ao usuário especificar o tamanho da etapa desejada:
Saída de amostra
Uso da amostra
Observe que o eixo x tem valores inteiros todos uniformemente espaçados por 5, enquanto o eixo y tem um intervalo diferente (o
matplotlib
comportamento padrão, porque os ticks não foram especificados).fonte