Portál AbcLinuxu, 6. listopadu 2025 15:22
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.