条形图没有for循环

时间:2017-12-10 12:44:24

标签: python matplotlib

是否有可能摆脱这个循环?

这是我的输入数据

import matplotlib.pyplot as plt

frac = [0.75, 0.6093, 0.7025, 0.0437, 0.1]

plt.figure()
orange, blue = '#fd7f28', '#2678b2'

然后这个丑陋的循环

for i in range(0,5):
    plt.bar(0.5+i, frac[i], color=blue)
    plt.bar(0.5+i, 1-frac[i], bottom=frac[i], color=orange)

plt.xticks([0.5, 1.5, 2.5, 3.5, 4.5], ['AR', 'BR', 'PE', 'RU', 'US'], 
rotation='horizontal')
plt.ylabel("Fraction")
plt.xlabel("")

plt.show()

It works, but i don't like it

我可以不用循环吗?

另外。当标记栏时,我输出此图例 enter image description here

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你所谓的“循环”通常被称为循环(或者在这种情况下是for循环)。

你可以轻松摆脱它。 As per the documentation, bar()接受标量(或向量)序列作为x=height=bottom=的输入。因此,您的代码可以简化为:

plt.bar(range(len(frac)), frac, bottom=0., color=blue, label="gmail")
plt.bar(range(len(frac)), 1-frac, bottom=frac, color=orange, label="hotmail")

为了使其开箱即用,我将您的frac列表转换为numpy数组,这样您就可以像“1-frac”那样进行算术运算。

完整代码:

frac = np.array([0.75, 0.6093, 0.7025, 0.0437, 0.1])
orange, blue = '#fd7f28', '#2678b2'

fig, ax = plt.subplots()
ax.bar(range(len(frac)), frac, bottom=0., color=blue, label="gmail")
ax.bar(range(len(frac)), 1-frac, bottom=frac, color=orange, label="hotmail")
ax.legend(loc=5, frameon=True)
ax.set_xticks(range(len(frac)))
ax.set_xticklabels(['AR', 'BR', 'PE', 'RU', 'US'])
plt.ylabel("Fraction")
plt.xlabel("")

enter image description here