是否有可能摆脱这个循环?
这是我的输入数据
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()
我可以不用循环吗?
答案 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("")