Nie mogę wymyślić, jak obrócić tekst na osi X. Jest to znacznik czasu, więc wraz ze wzrostem liczby próbek zbliżają się coraz bardziej, aż się pokrywają. Chciałbym obrócić tekst o 90 stopni, aby próbki nie zbliżały się do siebie, ponieważ zbliżają się do siebie.
Poniżej mam to, co działa, z tym wyjątkiem, że nie mogę wymyślić, jak obrócić tekst osi 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
źródło
źródło
ha
(wyrównanie w poziomie)Odpowiedzi:
To działa dla mnie:
źródło
ax.plot(...)
potemplt.xticks(rotation=90)
Łatwy sposób
Jak opisano tutaj , istnieje
matplotlib.pyplot
figure
klasa w klasie, która automatycznie obraca daty odpowiednio dla ciebie.Możesz to nazwać po wykreśleniu swoich danych (tj .
ax.plot(dates,ydata)
:Jeśli chcesz sformatować etykiety dalej, sprawdź powyższy link.
Obiekty inne niż data i godzina
Zgodnie languitar „s komentarz, metoda zasugerowałem dla non-datetime
xticks
nie aktualizuje poprawnie podczas powiększania, etc. Jeżeli nie jest todatetime
obiekt używany jako dane osi x, należy postępować Tommy ” s odpowiedź :źródło
Wiele „poprawnych” odpowiedzi tutaj, ale dodam jeszcze jedną, ponieważ uważam, że niektóre szczegóły zostały pominięte w kilku. OP poprosił o obrót o 90 stopni, ale zmienię na 45 stopni, ponieważ kiedy użyjesz kąta, który nie jest równy zero lub 90, powinieneś również zmienić wyrównanie w poziomie; w przeciwnym razie wasze etykiety będą niecentryczne i nieco mylące (i przypuszczam, że wiele osób, które tu przychodzą, chce obrócić osie do czegoś innego niż 90).
Najłatwiejszy / najmniejszy kod
opcja 1
Jak wspomniano wcześniej, może to nie być pożądane, jeśli wolisz podejście zorientowane obiektowo.
Opcja 2
Kolejny szybki sposób (przeznaczony dla obiektów daty, ale wydaje się, że działa na dowolnej etykiecie; wątpię jednak, by to było zalecane):
fig
zwykle otrzymujesz od:fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Zorientowany obiektowo / Radzenie sobie bezpośrednio z
ax
Opcja 3a
Jeśli masz listę etykiet:
Opcja 3b
Jeśli chcesz uzyskać listę etykiet z bieżącej działki:
Opcja 4
Podobne do powyższego, ale zamiast tego zapętlone ręcznie.
Opcja 5
Nadal używamy
pyplot
(asplt
) tutaj, ale jest on zorientowany obiektowo, ponieważ zmieniamy właściwość określonegoax
obiektu.Opcja 6
Ta opcja jest prosta, ale AFAIK nie można ustawić wyrównywania etykiety w poziomie w ten sposób, więc inna opcja może być lepsza, jeśli twój kąt nie wynosi 90.
Edycja: Dyskutowano na temat tego „błędu”, a potencjalna poprawka jest potencjalnie dostępna dla
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774źródło
Spróbuj pyplot.setp. Myślę, że możesz zrobić coś takiego:
źródło
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)
działa dobrze z backendem Qt4Agg. W moim przypadku zostanie zresetowanyplt.hist()
, więc nazywam go później, chociażplt.plot()
go nie resetuje, więc powinieneś być w porządku.locs, labels = plt.xticks() plt.setp(labels, rotation=90)
tuż przedplt.plot(time, delay)
nim i działał dobrze.Oprócz
jest to również możliwe:
źródło
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Wymyśliłem podobny przykład. Znów słowo kluczowe rotacji to… cóż, to klucz.
źródło
datetime
Moja odpowiedź jest zainspirowana odpowiedzią cjohnson318, ale nie chciałem podać zakodowanej listy etykiet; Chciałem obrócić istniejące etykiety:
źródło
Jeśli używasz
plt
:W przypadku użycia pand lub dna morskiego do wykreślenia, przyjmując
ax
za osie wykresu:Inny sposób wykonania powyższego:
źródło
for tick in ax.get_xticklabels(): tick.set_rotation(45)
zrobił dla mnie lewę.Jeśli chcesz zastosować obrót do obiektu osi, najłatwiej jest to zrobić
tick_params
. Na przykład.Dokumentacja Matplotlib tutaj .
Jest to przydatne, gdy masz zestaw osi zwróconych przez
plt.subplots
, i jest to wygodniejsze niż używanie,set_xticks
ponieważ w takim przypadku musisz również ustawić etykiety znaczników, a także wygodniejsze niż te, które iterują się nad kleszczami (z oczywistych powodów)źródło
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
.labelrotation=30
.źródło
Będzie to zależeć od tego, co planujesz.
W przypadku pand i dna morskiego, które dają ci obiekt Axes:
Jeśli potrzebujesz obrócić etykiety, możesz także zmienić rozmiar czcionki, możesz
font_scale=1.0
to zrobić.źródło
Aby obrócić etykietę osi x o 90 stopni
źródło
Najprostszym rozwiązaniem jest użycie:
ale również
np. dla dat użyłem rotacji = 45 i dołu = 0,20, ale możesz wykonać test dla swoich danych
źródło