Não consigo descobrir como girar o texto no eixo X. É um carimbo de data / hora, assim, à medida que o número de amostras aumenta, elas se aproximam cada vez mais até se sobreporem. Eu gostaria de girar o texto 90 graus para que as amostras se aproximem e não se sobreponham.
Abaixo está o que eu tenho, funciona bem com a exceção de que não consigo descobrir como girar o texto do eixo X.
import sys
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime
font = {'family' : 'normal',
'weight' : 'bold',
'size' : 8}
matplotlib.rc('font', **font)
values = open('stats.csv', 'r').readlines()
time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]
plt.plot(time, delay)
plt.grid(b='on')
plt.savefig('test.png')
python
matplotlib
tMC
fonte
fonte
ha
(Alinhar horizontal)Respostas:
Isso funciona para mim:
fonte
ax.plot(...)
plt.xticks(rotation=90)
Jeito fácil
Conforme descrito aqui , existe um método existente na
matplotlib.pyplot
figure
classe que gira automaticamente as datas adequadamente para a sua figura.Você pode chamá-lo depois de plotar seus dados (ou seja
ax.plot(dates,ydata)
:Se você precisar formatar ainda mais os rótulos, verifique o link acima.
Objetos não datetime
De acordo com o comentário do languitar , o método que sugeri para não data e hora
xticks
não seria atualizado corretamente ao aplicar zoom, etc. Se não for umdatetime
objeto usado como seus dados do eixo x, você deve seguir a resposta de Tommy :fonte
Muitas respostas "corretas" aqui, mas adicionarei mais uma, pois acho que alguns detalhes são deixados de fora de várias. O OP pediu uma rotação de 90 graus, mas vou mudar para 45 graus, porque quando você usa um ângulo que não é zero ou 90, deve alterar também o alinhamento horizontal; caso contrário, seus rótulos serão descentralizados e um pouco enganadores (e acho que muitas pessoas que vêm aqui querem girar os eixos para algo diferente de 90).
Código mais fácil / menos
Opção 1
Como mencionado anteriormente, isso pode não ser desejável se você preferir a abordagem orientada a objetos.
opção 2
Outra maneira rápida (destina-se a objetos de data, mas parece funcionar em qualquer rótulo; duvide que isso seja recomendado):
fig
você normalmente obteria de:fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Orientado a objeto / Lidando diretamente com
ax
Opção 3a
Se você tiver a lista de etiquetas:
Opção 3b
Se você deseja obter a lista de etiquetas do gráfico atual:
Opção 4
Semelhante ao anterior, mas alterna manualmente.
Opção 5
Ainda usamos
pyplot
(asplt
) aqui, mas é orientado a objetos, porque estamos alterando a propriedade de umax
objeto específico .Opção 6
Essa opção é simples, mas no AFAIK você não pode definir o alinhamento horizontal da etiqueta dessa maneira, assim outra opção pode ser melhor se o seu ângulo não for 90.
Editar: há uma discussão sobre esse "bug" exato e uma correção está potencialmente prevista para
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774fonte
Tente pyplot.setp. Eu acho que você poderia fazer algo assim:
fonte
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
funciona bem com o back-end Qt4Agg. No meu caso, ele é redefinidoplt.hist()
, então eu ligo depois, emboraplt.plot()
não o redefina, então você deve ficar bem.locs, labels = plt.xticks() plt.setp(labels, rotation=90)
pouco antesplt.plot(time, delay)
e funcionou bem.Appart from
isso também é possível:
fonte
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Eu vim com um exemplo semelhante. Mais uma vez, a palavra-chave rotação é ... bem, é a chave.
fonte
datetime
Minha resposta é inspirada na resposta de cjohnson318, mas eu não queria fornecer uma lista codificada de rótulos; Eu queria girar os rótulos existentes:
fonte
Se estiver usando
plt
:No caso de usar pandas ou seaborn na plotagem, assumindo
ax
como eixos para a plotagem:Outra maneira de fazer o acima:
fonte
for tick in ax.get_xticklabels(): tick.set_rotation(45)
fez o truque para mim.Se você deseja aplicar a rotação no objeto de eixos, a maneira mais fácil é usar
tick_params
. Por exemplo.Referência da documentação do Matplotlib aqui .
Isso é útil quando você tem uma matriz de eixos retornada
plt.subplots
e é mais conveniente do que usar,set_xticks
porque nesse caso você também precisa definir os rótulos dos ticks e também mais conveniente que aqueles que iteram nos ticks (por razões óbvias)fonte
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
.labelrotation=30
.fonte
Vai depender do que você está tramando.
Para pandas e transatlânticos que oferecem um objeto Axes:
Se você precisar rotacionar etiquetas, também poderá precisar alterar o tamanho da fonte,
font_scale=1.0
para fazer isso.fonte
Para girar o rótulo do eixo x para 90 graus
fonte
A solução mais simples é usar:
mas também
por exemplo, para datas que usei rotação = 45 e inferior = 0,20, mas você pode fazer alguns testes para seus dados
fonte