[Matplotlib] Horizontale Balken

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

`pylab.cfg()' löst das Problem. Danke CM ;)

Wenn es dir keine Ruhe lässt, formulier ichs nochmal verständlicher ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Och, nö - ich freue mich einfach mal richtig geraten zu haben ;-)

Gruß,
Christian
Antworten