Seite 1 von 1
matplotlib und barplot
Verfasst: Montag 6. September 2010, 13:47
von maria_dolores
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
Re: matplotlib und barplot
Verfasst: Montag 6. September 2010, 16:10
von gkuhl
Hallo,
verwende ``fig.add_axes``, anstelle von ``fig.add_subplot``.
Grüße
Gerrit
Re: matplotlib und barplot
Verfasst: Montag 6. September 2010, 16:47
von maria_dolores
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
Re: matplotlib und barplot
Verfasst: Montag 6. September 2010, 18:41
von DaMutz
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?
Re: matplotlib und barplot
Verfasst: Mittwoch 8. September 2010, 10:12
von maria_dolores
@DaMutz: danke. Das hat super geholfen.
Ich habe da noch eine Frage. Kann man den Abstand zwischen den Balken irgendwie definieren?
Gruß
Isa
Re: matplotlib und barplot
Verfasst: Mittwoch 8. September 2010, 12:36
von gkuhl
Der Abstand ist gegeben durch die x-Position zweier benachbarter Balken und deren Breite. Damit kann man das leicht ausrechnen.
Re: matplotlib und barplot
Verfasst: Donnerstag 16. September 2010, 16:41
von maria_dolores
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
Re: matplotlib und barplot
Verfasst: Donnerstag 16. September 2010, 18:57
von DaMutz
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:
mehr Infos unter
http://matplotlib.sourceforge.net/api/figure_api.html und dann auf der Seite nach 'legend' suchen.