Portál AbcLinuxu, 30. dubna 2025 12:39
Matplotlib je knihovna umožňující kreslit docela pěkné grafy a to přímo z mého oblíbeného Pythonu. Dnes jsem řešil problém s kreslením grafu, kde jedna osa má být časová — s datumy.
Matplotlib v modulu pylab
obsahuje funkci plot_date()
, kterou jsem dříve používal a stačila mi. Tato funkce umí zobrazit ordinální hodnotu data, získanou pomocí date2num()
jako krásné, do řetězce formátované datum.
import pylab as pl import datetime as dt # Připravíme data. dates=[dt.date(2007, 5,10), dt.date(2008,11,13), dt.date(2008,12,11), dt.date(2009,5,19)] means=pl.randn(len(dates)) # Kreslíme. pl.plot_date(pl.date2num(dates), means, "-") # Hold your hats, it is show time! pl.show()Dnes jsem ovšem potřeboval vyrobit
errorbargraf, který má na vodorovné ose data, což asi vylučuje použití
plot_date()
.
Jak už to bývá, řešením je RTFM, ale tentokrát toho na toto téma v TFM nebylo mnoho napsáno. Ovšem stačilo to a vykouzlil následující kód, který snad všecko vysvětlí sám
import matplotlib.dates as md # Příprava dat. variances=pl.randn(len(means)) mean_vars_plot = pl.subplot(1, 1, 1) # Kreslíme. pl.errorbar(pl.date2num(dates), means, variances) # Tady je to kouzlo -- změníme lokátor ticků na ose dl = md.AutoDateLocator() mean_vars_plot.xaxis.set_major_locator(dl) # a změníme formátovač popisků. mean_vars_plot.xaxis.set_major_formatter( md.AutoDateFormatter(dl) ) # Pochlubíme se výsledkem pl.show()
Pokud si ještě trochu pohrajete se zoomem a polohou, výsledný graf může vypadat třeba nějak takhle pěkně:
Nakonec bych rád upozornil, že když jsem měl nastavování xaxis
někde před kreslícími příkazy, dostával jsem záhadné výjimky
ValueError: ordinal must be >= 1
, tak si na to dávejte pozor.
Update: vyměnil jsem graf za nějaký, který lépe ukazuje data i s měsíci, ale taky to, že mám ještě problém s diakritikou. Matplotlib evidentně používá nějaký neobsáhlý font.
Tiskni
Sdílej:
ano-taky už jsem to kdysi řešil - je třeba nastavit jiný font.
Ba ne, právě jsem zjistil, že jsem kecal - chyba byla asi v kódování. matplotlib používá, myslím, gtk a to chce zřejmě unicode, kdežto já předával popisky v utf8. Takže použití U"" stringů pomohlo.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.