Seite 1 von 1

Fehlerhafte Legende mit matplotlib [solved]

Verfasst: Mittwoch 19. März 2008, 11:12
von helduel
Moin,

ich bastel momentan einige Diagramme mit matplotlib und das funktioniert eigentlich auch ganz gut (wenn man mal einigermaßen durchgestiegen ist).

Jetzt habe ich aber einige Probleme mit den Balkendiagrammen. An Doku finde ich nicht sehr viel dazu. Mein Problem: Ich habe sieben Balken pro Spalte auf der X-Achse. Jeder der sieben Balken hat eine eigene Farbe. Gezeichnet wird das ganze dann auch korrekt. Aber die Farben in der Legende sind falsch: Ich habe da sechs mal die Farbe des ersten Balkens ein einmal die Farbe des zweiten :?. Entweder ich mache was falsch, oder da steckt ein Bug drin. Male ich das gleiche als Liniendiagramm, dann stimmt die Legende.

Hier mein Code:

Code: Alles auswählen

from itertools import cycle

from matplotlib.pylab import show, figure
from matplotlib.figure import SubplotParams

COLORS = ['#990000', '#CC0000', '#FF3300',
          '#FF6600', '#FF9900', '#FFCC00', '#FFFF33',]

LABELS = ('Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 
          'Freitag', 'Samstag', 'Sonntag',)

BAR_WIDTH = 6

color_pool = cycle(COLORS)

x_data = [50, 100, 150, 200, 250, 300]
y_data = [
    [325, 679, 591, 703, 744, 670],
    [313, 711, 709, 481, 878, 743],
    [377, 729, 686, 386, 1022, 783],
    [401, 687, 708, 576, 1006, 406],
    [379, 516, 647, 610, 624, 770],
    [138, 125, 104, 174, 142, 172],
    [93, 173, 71, 130, 182, 140],
]

fig = figure()
fig.subplotpars = SubplotParams(right=.7) # keep space for legend
plot = fig.add_subplot(111)

entries = list()
for i, y in enumerate(y_data):
    adjusted_x = map(lambda v: (v + i * BAR_WIDTH), x_data)
    entry = plot.bar(adjusted_x, y, width=BAR_WIDTH, color=color_pool.next())
    #entry = plot.plot(adjusted_x, y,
    #                  linewidth=BAR_WIDTH, color=color_pool.next())
    entries.append(entry)

fig.legend(entries, LABELS, 'center right')

show()
Weiß einer von euch, was da schief läuft?

Gruß,
Manuel

Verfasst: Mittwoch 19. März 2008, 11:29
von CM
Hoi,

ich nehme an, Du möchtest

Code: Alles auswählen

entries.append(entry[0])
?

Schau Dir mal die Rückgabewerte von .bar() an. (Ich gebe zu, daß es besser wäre hier eine Fehlermeldung zu schmeissen. Sollte man vielleicht anregen.)

Gruß,
Christian

Verfasst: Mittwoch 19. März 2008, 11:50
von helduel
CM hat geschrieben:Schau Dir mal die Rückgabewerte von .bar() an. (Ich gebe zu, daß es besser wäre hier eine Fehlermeldung zu schmeissen. Sollte man vielleicht anregen.)
Stimmt. Obwohl es ja mein Linien funktioniert und hier wird auch eine Liste pro Linie zurückgegeben. Lediglich bei den Bar-Charts enthält jede Liste mehrere Einträge...

Jetzt funktioniert's jedenfalls. Vielen Dank!

Gruß,
Manuel