Seite 1 von 1

[Matplotlib] Horizontale Balken

Verfasst: Dienstag 31. März 2009, 15:57
von cofi
Ich erstelle mit folgender Funktion Balkendiagramme:

Code: Alles auswählen

def draw_chart(data, name):
    sorted_data = sorted(data, key=lambda x: x[1], reverse=True)
    labels = [set[0] for set in sorted_data]
    values = [set[1] for set in sorted_data]
    positions = pylab.arange(3) + 0.5
    pylab.figure(1)
    pylab.barh(positions, values, color="grey", edgecolor="black")
    path = os.path.join(OUT_PATH, name)
    pylab.savefig(path)
Das Problem ist nur, dass ich dabei hässliche Striche mittendrin
bekomme. Wie werd ich die los bzw woher kommen die denn überhaupt?

Außerdem würde ich die Beschriftung der Balken gern auf den Balken selbst legen,
hat da jemand eine Idee?

Matplotlib - 0.98.5.2

Verfasst: Dienstag 31. März 2009, 17:13
von CM
Hoi,

die Balken kommen daher, dass Dein Backend "Grau nicht kennt". Was passiert ist, dass versucht wird ein gleimäßiges Grau (schwarze und weisse Pixel in regelmäßigen Abständen, je nach Grauwert unterschiedliche Abstände) zu interpolieren. Das klappt aber nur bedingt und manchmal kommt es zu "Stauchungen": Dein Plot bekommt einen schwarzen Balken.

Du kannst Folgendes versuchen:
- gib mal den Parameter 'antialiased=True' mit
- versuche verschiedene Grauwerte nahe dem gewünschten Grauwert - irgendwann mag es funktionieren ohne Balken hinzukommen, aber nur für diese Größe Deiner Abbildung.
- gar kein Grau angeben, sondern irgendeine andere Farbe. (wobei es u. U. zu ähnlichen Effekten kommen kann.)

Text kannst Du mit pylab.text positionieren: Zur vertikalen Position der Balken die Hälfte deren Höhe hinzuzählne und einen horizontalen Offset wählen, der Dir gefällt.

HTH
Christian

PS Welches Backend benutzt Du? Ggf. hilft auch auf ein 'Agg'-Derivat umzustellen - aber ohne Garantie.

Verfasst: Dienstag 31. März 2009, 20:46
von cofi
Das Backend war GtkAgg. Hab jetzt mal auf SVG umgestellt und danach die Datei
untersucht. Die Striche sind kein Fehler, alles wunderbar ... nur aus
irgendeinem Grund werden sehr viele Balken gezeichnet. Die Striche sind dabei der Rand.
Als Workaround hab ich jetzt den Rand ausgeschaltet.
Allerdings würde mich das `Warum' schon interessieren...

P.S. `values' ist eine Liste mit 3 Integern.

Edit: Rätsel gelöst. `savefig' löscht wohl anders als ich angenommen hab, nicht den Plot.
Wenn ich in andere `Figure's zeichne, löst sich das Problem teilweise,
seltsamerweise tritt es bei ein paar Plots trotzdem noch auf.
Was könnte man da tun?

Verfasst: Mittwoch 1. April 2009, 10:42
von CM
Deine zweite Problembeschreibung habe ich nicht verstanden, daher kann ich auch nicht sagen, was zu tun ist. Wenn das sonst auch niemand sagen kann, magst Du vielleicht wieder ein Bild verlinken.

Damit das mit den neu zu erstellenden Figures nicht auftritt, kannst Du pylab.clf() ausprobieren.

Gruß,
Christian

Verfasst: Mittwoch 1. April 2009, 12:56
von cofi
`pylab.cfg()' löst das Problem. Danke CM ;)

Wenn es dir keine Ruhe lässt, formulier ichs nochmal verständlicher ;)

Verfasst: Mittwoch 1. April 2009, 20:00
von CM
Och, nö - ich freue mich einfach mal richtig geraten zu haben ;-)

Gruß,
Christian