2013-02-14 3 views
5

Я создаю бар участок с Matplotlib в Python, и у меня немного проблемы с перекрытием баров:Два гистограммы в Matplotlib перекрывающие неправильный путь

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

Я хочу, чтобы синие полосы были впереди, а не красные. Единственное, что мне удалось сделать до сих пор, это переключить ax и ax2, но тогда иглавы также будут отменены, чего я не хочу. Разве нет простого способа сказать matplotlib для рендеринга ax2 перед топор?

Кроме того, ylabels справа обрезаются plt.tight_layout(). Есть ли способ избежать этого, продолжая использовать tight_layout?

ответ

6

Возможно, есть лучший способ, о котором я не знаю; Однако, вы можете своп ax и ax2, а также поменять расположение соответствующих y -ticks с

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


Кстати, вместо того, чтобы делать по математике вы можете центрировать бары, используя параметр align='center' эр:

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() 

(Результат по существу такой же, как указано выше.)

+0

Спасибо! Это сделал трюк. И спасибо за подсказку! Я всегда думал, что просто должен быть более простой способ сделать это. – Conti

Смежные вопросы