6

我正在用 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()

条形图

我希望蓝色条在前面,而不是红色条。到目前为止,我设法做到的唯一方法是切换 ax 和 ax2,但随后 ylabels 也将被反转,这是我不想要的。难道没有一种简单的方法可以告诉 matplotlib 在 ax 之前渲染 ax2 吗?

另外,右边的 ylabels 被 plt.tight_layout() 截断了。有没有办法在仍然使用tight_layout 的同时避免这种情况?

4

1 回答 1

8

也许有更好的方法我不知道;但是,您可以交换axax2交换相应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()

在此处输入图像描述


顺便说一句,您可以使用以下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()

(结果与上述基本相同。)

于 2013-02-14T20:40:48.463 回答