2013-02-14 51 views
5

Sto creando un grafico a barre con matplotlib in Python, e sto avendo un po 'di problemi con le barre sovrapposte:Due grafici a barre in matplotlib sovrapposti nel modo sbagliato

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

Voglio che le barre blu siano davanti, non quelle rosse. L'unico modo in cui sono riuscito a farlo finora è stato il cambio di axe e ax2, ma poi anche gli ylabels verranno invertiti, cosa che non voglio. Non c'è un modo semplice per dire a matplotlib di rendere ax2 prima dell'ascia?

Inoltre, gli ylabel di destra vengono interrotti da plt.tight_layout(). C'è un modo per evitarlo mentre usi ancora tight_layout?

risposta

6

Forse c'è un modo migliore che non conosco; tuttavia, è possibile di swap ax e ax2 e anche scambiare la posizione dei corrispondenti y -ticks con

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


A proposito, invece di fare la matematica te stesso, puoi centrare le barre usando il parametro 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() 

(Il risultato è essenzialmente lo stesso come sopra.)

+0

Grazie! Questo ha fatto il trucco. E grazie anche per il suggerimento! Ho sempre pensato che ci fosse solo un modo più semplice per farlo .. – Conti