2013-02-14 11 views
5

Tworzę fabuły bar z matplotlib w Pythonie, i mam trochę problem z nakładającymi barów:Dwa wykresy słupkowe w matplotlib zachodzą na wspak

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

Chcę, aby niebieskie paski były z przodu, a nie czerwone. Jedynym sposobem, w jaki udało mi się to zrobić do tej pory, było przełączenie siekiery i siekiery 2, ale wtedy tabliczki będą również odwrócone, czego nie chcę. Czy nie istnieje prosty sposób powiedzenia matplotlibowi, aby renderował topór przed toporem?

Dodatkowo, znaczniki po prawej są odcinane przez plt.tight_layout(). Czy istnieje sposób, aby tego uniknąć, ciągle używając tight_layout?

Odpowiedz

6

Być może jest lepszy sposób, o którym nie wiem; Jednak może wymiany ax i ax2 a także zamienić położenie odpowiednich y -ticks z

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


Nawiasem mówiąc, zamiast robić sama matematyka, możesz wyśrodkować pręty przy użyciu parametru align='center' 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() 

(Wynik jest w zasadzie takie same jak powyżej.)

+0

Dzięki! To wystarczyło. I dzięki za napiwek! Zawsze myślałem, że po prostu musi być prostszy sposób, aby to zrobić ... – Conti

Powiązane problemy