matplotlib und 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
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

Hallo zusammen,

ich hänge mal wieder an einem bar-plot und habe ein Problem. In meinem Plot drehe ichdie x-Achse. Allerdings wird bei etwas längerem Text dann alles 'abgeschnitten'. Man kann es wieder sichtbar machen, wenn man das Plot-Fenster größer zieht. Kann man das auch irgendwie einstellen, dass der Bereich, in dem der Plot angezeigt ist, größer ist und man dann auch den ganzen Text sehen kann?

Hier mein Beispielcode:

Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot( 111 )
width = 0.09
x = [ 'Heute Vielleicht Oder', ' Aber Auch Morgen', 'Eventuell auch Uebermorgen', 'Irgendwann einmal vielleicht', 'wann anders' ]
y = [ 106, 107, 108, 109, 110 ]
z = [2,4,6,8,10]
N = len(x)
ind = np.arange(N)
ax2 = ax.twinx()
plots = ax.bar( ind, y, width, color='k' )
for plot in plots:
    plot = ax2.bar( ind + width, z, width, color='orange' )
plt.xticks( ind + width, x )
ax.set_xticklabels( x, rotation = 30 )

plt.show()
Habt ihr eine Idee wie man das machen könnte?

Grüßle
Isa
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hallo,

verwende ``fig.add_axes``, anstelle von ``fig.add_subplot``.

Grüße
Gerrit
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

Hallo Gerrit,

danke. Das klappt und sieht gut aus.

Hast Du vielleicht auch eine Idee, wie man die Beschriftung der x-Achse näher an die Balken bekommt? Momentan beginnt die Beschriftunge der Balken hinter den Balken. Ich hoffe, Du verstehst, was ich meine.

Und gleich noch eine Frage. Wenn ich die Rotation erhöhe, zB auf rotation = 33, dann fliegt die Beschriftung wieder raus.
Da es so klappt, werde ich es natürlich so lassen. Mich würde nur interessieren, ob man das prinzipiell irgendwie machen kann.


---------------------------------------------------------------------------------------------------------------------

Auf meine erste Frage hab ich die Lösung eben gefunden. Wenn man die rotation auf bspw. 70 setzt, ist sie direkt unter den Balken. Allerdings ist bei einer solchen rotation die Beschriftung wieder abgeschnitten...

Grüßle
Isa
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

Code: Alles auswählen

ax.set_xticklabels(x, rotation = 30, ha='right')
aber ich frage mich ob man dies alles verändern muss. Gibt es nicht schlaue default Werte, damit man nicht so viel manuell anpassen muss?
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

@DaMutz: danke. Das hat super geholfen.

Ich habe da noch eine Frage. Kann man den Abstand zwischen den Balken irgendwie definieren?

Gruß
Isa
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Der Abstand ist gegeben durch die x-Position zweier benachbarter Balken und deren Breite. Damit kann man das leicht ausrechnen.
maria_dolores
User
Beiträge: 39
Registriert: Dienstag 10. August 2010, 12:38

Also ich muss jetzt doch nochmal fragen.
Irgendwie finde ich es gar nicht so einfach die Abstände einzufügen.

Bei diesem Plot möchte ich, dass vor und hinter dem ersten, jedem weiteren und dem letzten x-Achsen Eintrag der Abstand gleich 'zwei Balken' sein soll.

Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
fig.clear()
width = 0.3
ax = fig.add_axes([0.1,0.17,0.6,0.8])

x = ('heute', 'morgen', 'uebermorgen', 'naechste woche', 'gar nicht')

y = range(15,20,1)
z = range(20,25,1)
N = len(x)
ind = np.arange(N)
plot1 = ax.bar( ind+ width, y, width, color = 'black' )
plot2 = ax.bar( ind + 2*width, (z), width, color = 'orange' )
plt.xticks(ind, x, ha = 'right', rotation = 54, size = 'small')
leg = fig.legend( (plot1[0], plot2[0]), ('x_achse', 'y-achse'), 'center right' )
for entry in leg.get_texts():
    entry.set_fontsize('small')

plt.show()
Mit dem Hinweis
gkuhl hat geschrieben:Der Abstand ist gegeben durch die x-Position zweier benachbarter Balken und deren Breite. Damit kann man das leicht ausrechnen.
bin ich allerdings ehrlich gesagt nicht sehr weit gekommen.
Ich dachte, ich könnte es vielleicht so machen: Die Anzahl der x-Achsen Einträge beträgt 5. Die Anzahl der Balken pro Einheit ist 2 und die Breite eines Balkens beträgt 0,3. Dann könnte man den Abstand mit abstand = anzahlbalken+2*balkenbreite berechnen. Ob das aber richtig ist...
Ich habe jetzt schon lange drüber nachgedacht, bin aber nicht darauf gekommen, wie ich das dann in den Plot einfügen kann.

Kannst Du mir vielleicht nochmal helfen?

Danke.
Gruß
Isa
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

du kämpfst doch schon sehr lange mit matplotlib. Bei den xticks muss doch der erste Wert die Position der Ticks, in deinem Fall willst du diese doch 'ind + 2 * width' damit der rechte Punkt genau zwischen den beiden Balken ist, oder nicht? Falls nicht so kannst du noch einen zusätzlichen Offset dazurechnen oder die 2 durch eine 3 ersetzen.

Weiter kannst du die for-Schleife weglassen, denn die legend() Methode kennt das Keyword prop und mit diesem kann die Schrift eingestellt werden:

Code: Alles auswählen

, prop={'size': 'small'})
mehr Infos unter http://matplotlib.sourceforge.net/api/figure_api.html und dann auf der Seite nach 'legend' suchen.
Antworten