Две гистограммы в matplotlib неправильно перекрываются

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

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

Барплот

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

Кроме того, метки справа обрезаются функцией plt.tight_layout(). Есть ли способ избежать этого при использовании tight_layout?


person Conti    schedule 14.02.2013    source источник


Ответы (1)


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

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

введите здесь описание изображения


Кстати, вместо того, чтобы заниматься математикой самостоятельно, вы можете центрировать столбцы, используя параметр 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()

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

person unutbu    schedule 14.02.2013
comment
Спасибо! Это помогло. И за подсказку тоже спасибо! Я всегда думал, что должен быть более простой способ сделать это.. - person Conti; 15.02.2013