Mam problem z obracaniem moich znaczników daty w matplotlib. Mały przykładowy program znajduje się poniżej. Jeśli spróbuję obrócić kleszcze na końcu, kleszcze nie obracają się. Jeśli spróbuję obrócić znaczniki, jak pokazano pod komentarzem „awarie”, wtedy matplot lib ulega awarii.
Dzieje się tak tylko wtedy, gdy wartości x są datami. Jeśli zastąpię zmienną dates
zmienną t
w wywołaniu avail_plot
, xticks(rotation=70)
połączenie działa dobrze w środku avail_plot
.
Jakieś pomysły?
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
źródło
źródło
Odpowiedzi:
Jeśli wolisz podejście nie zorientowane obiektowo, przejdź
plt.xticks(rotation=70)
na prawo przed dwomaavail_plot
wywołaniami, npPowoduje to ustawienie właściwości obrotu przed skonfigurowaniem etykiet. Ponieważ masz tutaj dwie osie,
plt.xticks
po wykonaniu dwóch wykresów jest zdezorientowany. W momencie, gdyplt.xticks
nic nie robi,plt.gca()
nie nie daje osie, które chcesz zmodyfikować, i takplt.xticks
, która działa na obecnych osi, nie ma pracy.Aby nie używać podejścia zorientowanego obiektowo
plt.xticks
, możesz użyćpo dwóch
avail_plot
telefonach. W szczególności ustawia to obrót na prawidłowych osiach.źródło
plt.setp
, możesz ustawić wiele parametrów, określając je jako dodatkowe argumenty słów kluczowych.horizontalalignment
kwarg jest szczególnie przydatna podczas obracania etykiet podziałki:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
w dowolnym miejscu.plt.setp
rozwiązanie jest całkowicie zorientowany obiektowo. Jeśli nie podoba ci się fakt, że cośplt
w nim jest, użyjfrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
zamiast tego.plt.xticks
pyplot. Sama dokumentacja mówi, aby nie mieszać stylów.plt.setp
jest bardziej szczegółowy, ale nie jest też typowym stylem zorientowanym obiektowo. Twoja odpowiedź jest tutaj zdecydowanie najlepsza. Zasadniczo wszystko, co ma funkcję, nie jest zorientowane obiektowo. Nie ma znaczenia, czy importujesz,setp
czy nie.yticks
, a kod nie ma zdefiniowanego ax w ogóle pozaavail_plot
...Rozwiązanie działa dla matplotlib 2.1+
Istnieje metoda osi,
tick_params
która może zmieniać właściwości znaczników. Istnieje również jako metoda osi, jakset_tick_params
Lub
Na marginesie, obecne rozwiązanie łączy stanowy interfejs (przy użyciu pyplot) z interfejsem zorientowanym obiektowo za pomocą polecenia
plt.xticks(rotation=70)
. Ponieważ kod w pytaniu wykorzystuje podejście obiektowe, najlepiej jest trzymać się tego podejścia przez cały czas. Rozwiązanie daje dobre jawne rozwiązanie zplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
źródło
Prostym rozwiązaniem, które pozwala uniknąć zapętlenia się znaczników, jest po prostu użycie
fig.autofmt_xdate()
To polecenie automatycznie obraca etykiety osi x i dostosowuje ich położenie. Wartości domyślne to kąt obrotu 30 ° i wyrównanie poziome „w prawo”. Ale można je zmienić w wywołaniu funkcji
Dodatkowy
bottom
argument jest równoważny ustawieniuplt.subplots_adjust(bottom=bottom)
, które pozwala ustawić dopełnienie dolnych osi na większą wartość, aby hostować obrócone etykiety znaczników.Więc w zasadzie tutaj masz wszystkie ustawienia, których potrzebujesz, aby mieć ładną oś daty w jednym poleceniu.
Dobry przykład można znaleźć na stronie matplotlib.
źródło
plt.setp
podejścia, albo zapętlić tiki (co jest zasadniczo takie samo).twinx
) są obecne, zaburza to wyrównanie między znacznikami a etykietami znaczników. W takim przypadku rozwiązanie Teda Petrou jest lepsze.Innym sposobem zastosowania
horizontalalignment
irotation
do każdej etykiety ticka jest wykonaniefor
pętli nad etykietami tików, które chcesz zmienić:A oto przykład, jeśli chcesz kontrolować lokalizację głównych i mniejszych tików:
źródło
Po prostu użyj
źródło