Estou com um problema ao tentar alternar meus marcadores de data no matplotlib. Um pequeno programa de amostra está abaixo. Se eu tentar girar os carrapatos no final, eles não serão rotacionados. Se eu tentar girar os ticks, conforme mostrado no comentário 'travamentos', a matplot lib travará.
Isso só acontece se os valores x forem datas. Se eu substituir a variável dates
pela variável t
na chamada para avail_plot
, a xticks(rotation=70)
chamada funcionará bem por dentro avail_plot
.
Alguma ideia?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
python
matplotlib
Neal
fonte
fonte
Respostas:
Se você preferir uma abordagem não orientada a objetos, vá
plt.xticks(rotation=70)
para a direita antes das duasavail_plot
chamadas, por exemploIsso define a propriedade de rotação antes de configurar os rótulos. Como você tem dois eixos aqui,
plt.xticks
fica confuso depois de fazer os dois gráficos. No momento em queplt.xticks
não faz nada,plt.gca()
não não dar-lhe os eixos que pretende modificar, e assimplt.xticks
, que atua sobre os eixos atuais, não está indo para o trabalho.Para uma abordagem orientada a objeto que não está sendo usada
plt.xticks
, você pode usarapós as duas
avail_plot
chamadas. Isso define a rotação nos eixos corretos especificamente.fonte
plt.setp
pode definir vários parâmetros, especificando-os como argumentos adicionais de palavras-chave. ohorizontalalignment
kwarg é particularmente útil quando você girar os rótulos de escala:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
em qualquer lugar.plt.setp
solução é completamente orientada a objetos. Se você não gosta do fato de que existe algumplt
, use-ofrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
.plt.xticks
que é pyplot. A documentação em si diz para não misturar estilos.plt.setp
é mais detalhado, mas também não é o estilo típico de orientação a objetos. Sua resposta é definitivamente a melhor aqui. Basicamente, qualquer coisa com uma função não é orientada a objetos. Não importa se você importasetp
ou não.yticks
, eo código não tem machado definido em tudo fora deavail_plot
...A solução funciona para o matplotlib 2.1+
Existe um método de eixos
tick_params
que pode alterar as propriedades do tick. Também existe como método de eixo comoset_tick_params
Ou
Como uma nota lado, a solução actual mistura a interface com informações de estado (utilizando pyplot) com a interface orientada para o objecto, utilizando o comando
plt.xticks(rotation=70)
. Como o código da pergunta usa a abordagem orientada a objetos, é melhor manter essa abordagem o tempo todo. A solução fornece uma boa solução explícita complt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
fonte
Uma solução fácil que evita repetir os ticklabes é usar apenas
fig.autofmt_xdate()
Este comando gira automaticamente os rótulos de xaxis e ajusta sua posição. Os valores padrão são um ângulo de rotação de 30 ° e alinhamento horizontal "à direita". Mas eles podem ser alterados na chamada de função
O
bottom
argumento adicional é equivalente à configuraçãoplt.subplots_adjust(bottom=bottom)
, que permite definir o preenchimento dos eixos inferiores para um valor maior para hospedar as etiquetas rotacionadas.Então, basicamente, aqui você tem todas as configurações necessárias para ter um bom eixo de data em um único comando.
Um bom exemplo pode ser encontrado na página matplotlib.
fonte
plt.setp
abordagem ou faça um loop sobre os ticks (que são essencialmente os mesmos).twinx
) estão presentes, ele estraga o alinhamento entre os ticks e os rótulos dos ticks. Nesse caso, a solução de Ted Petrou é melhor.Outra maneira de aplicar
horizontalalignment
erotation
a cada rótulo de escala é fazer umfor
loop sobre os rótulos de escala que você deseja alterar:E aqui está um exemplo, se você deseja controlar a localização de ticks maiores e menores:
fonte
Basta usar
fonte