2013-02-14 7 views
5

Ich bin ein Balkendiagramm mit matplotlib in Python zu schaffen, und ich bin ein bisschen ein Problem mit den überlappenden Balken mit:Zwei Balkendiagramme in matplotlib die falsche Art und Weise überlappende

import numpy as np 
import matplotlib.pyplot as plt 

a = range(1,10) 
b = range(4,13) 
ind = np.arange(len(a)) 
width = 0.65 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.bar(ind+width, a, width, color='#b0c4de') 

ax2 = ax.twinx() 
ax2.bar(ind+width+0.35, b, 0.45, color='#deb0b0') 

ax.set_xticks(ind+width+(width/2)) 
ax.set_xticklabels(a) 

plt.tight_layout() 

Barplot

Ich möchte, dass die blauen Balken vorne sind, nicht die roten Balken. Der einzige Weg, den ich bis jetzt geschafft habe, war, Axt und Ax2 zu wechseln, aber dann werden auch die Ylabels umgekehrt, was ich nicht will. Gibt es nicht einen einfachen Weg, um matplotlib zu sagen, ax2 vor der Axt zu rendern?

Zusätzlich werden die ylabels auf der rechten Seite von plt.tight_layout() abgeschnitten. Gibt es eine Möglichkeit, dies zu vermeiden, während Sie weiterhin tight_layout verwenden?

Antwort

6

Vielleicht gibt es einen besseren Weg, den ich nicht kenne; Sie jedoch können Swap ax und ax2 und auch tauschen die Position der entsprechenden y -ticks mit

ax.yaxis.set_ticks_position("right") 
ax2.yaxis.set_ticks_position("left") 

import numpy as np 
import matplotlib.pyplot as plt 

a = range(1,10) 
b = range(4,13) 
ind = np.arange(len(a)) 
width = 0.65 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.bar(ind+width+0.35, b, 0.45, color='#deb0b0') 

ax2 = ax.twinx() 
ax2.bar(ind+width, a, width, color='#b0c4de') 

ax.set_xticks(ind+width+(width/2)) 
ax.set_xticklabels(a) 

ax.yaxis.set_ticks_position("right") 
ax2.yaxis.set_ticks_position("left") 

plt.tight_layout() 
plt.show() 

enter image description here


By the way, anstatt das zu tun Die Mathematik selbst, können Sie die Bars mit dem align='center' Parameter zentrieren er:

import numpy as np 
import matplotlib.pyplot as plt 

a = range(1,10) 
b = range(4,13) 
ind = np.arange(len(a)) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.bar(ind+0.25, b, 0.45, color='#deb0b0', align='center') 

ax2 = ax.twinx() 
ax2.bar(ind, a, 0.65, color='#b0c4de', align='center') 

plt.xticks(ind, a) 
ax.yaxis.set_ticks_position("right") 
ax2.yaxis.set_ticks_position("left") 

plt.tight_layout() 
plt.show() 

(Das Ergebnis ist im Wesentlichen die gleiche wie oben.)

+0

Dank! Das hat den Trick gemacht. Und danke für den Tipp auch! Ich dachte immer, dass es einfach einen einfacheren Weg dafür geben muss. – Conti