Seite 1 von 1

matplotlib, datetimte und ein barplot

Verfasst: Donnerstag 11. Juni 2009, 07:36
von würmchen
Hallo Leute,
ich bin ein klein wenig am Verzweifeln, wie ich einen Barplot für bestimmte Tage oder Stunden mache.

Ich hab mir ein Script zum zeigen zusammengebastelt, ist nur zur Demonstration.

Code: Alles auswählen

#!/usr/bin/python
from datetime import datetime, timedelta
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.dates as mdates

N = 100
now = datetime.now()
zeiten = []
for i in range(N):
    zeiten.append(now+timedelta(minutes=i))

werte = [i*2 for i in range(len(zeiten))]
werte.reverse()

hours = mdates.MinuteLocator((0,30))
minuteFmt = mdates.DateFormatter('%H:%M')

fig = plt.figure()
ax = fig.add_subplot(111)

ax.bar(zeiten,werte)

datemin = datetime.now()-timedelta(minutes=5)
datemax = datetime.now()+timedelta(minutes=N+20)
ax.set_xlim(datemin, datemax)
ax.xaxis.set_major_locator(hours)
ax.xaxis.set_major_formatter(minuteFmt)

fig.autofmt_xdate()

plt.show()
Was mich an der Sache wundert, warum laufen die bars immer bis ins Unendliche?

selbst wenn ich widht=0.1 oder ähnliches definiere, die laufen immer aus dem Bild raus. Weiß jemand was ich hier falsch mache?

Verfasst: Donnerstag 11. Juni 2009, 09:24
von CM
Hoi,

Die bars laufen gar nichts ins Unendliche. ;-)
Was matplotlib macht ist Annahmen treffen treffen, wie groß die Breite eines Balkens sein soll. Mangels Alternativen fällt es hier auf den default zurück und der ist 'days'. Bißchen viel, wenn es um Minuten geht.
Lösung:

Code: Alles auswählen

ax.bar(zeiten, werte, width = mdates.minutes(1))
Wobei das noch nicht optimal aussieht, weil die Grenzen zuviel Weiß links und rechts der Plots erlauben - aber das überlasse ich Dir ;-).

HTH
Christian

Verfasst: Donnerstag 11. Juni 2009, 11:23
von würmchen
Ah guck ä mol schau...
Da ist der Hase begraben... :-)

Hast Du da ne genauere Doku zu, auf der matplotlib Seite bin ich nicht schlau geworden daraus, bzw hab den Punkt mit den den Defaultwerten nicht gesehen.

das mit dem wenigen Platz ist schon ok, will eh eine durchgehen Fläche zeichnen. für einen Plot hab ich das irgendwie nicht hinbekommen.

Danke

Verfasst: Donnerstag 11. Juni 2009, 12:01
von CM
Ich habe auch nur: http://matplotlib.sourceforge.net/api/axes_api.html

Relevant ist aber 'convert_units()' in axis.py, denn darauf fällt alles schließlich zurück. Ich gebe zu: Das wüßte ich nicht, wenn ich nicht mal drüber gestolpert wäre. Es wäre eigentlich ein feature-request wert, diese Funktionalität mit besseren Defaults zu versehen.

Gruß,
Christian

Verfasst: Donnerstag 11. Juni 2009, 12:31
von EyDu
Es ist übrigens ein Hund :wink:

Verfasst: Donnerstag 11. Juni 2009, 13:03
von Dill
und der Hase liegt im Pfeffer. :idea:

warum auch immer...