matplotlib, datetimte und ein barplot

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Es ist übrigens ein Hund :wink:
Das Leben ist wie ein Tennisball.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

und der Hase liegt im Pfeffer. :idea:

warum auch immer...
http://www.kinderpornos.info
Antworten