如何让柱状图自动循环不同颜色?
在 matplotlib
这个库里,画线图的时候,颜色会自动循环变化。所以这两条线图的颜色会不一样。
axes.plot(x1, y)
axes.plot(x2, y)
但是,画柱状图的时候就不是这样了。这两组数据的柱子都是蓝色的。
axes.bar(x1, y)
axes.bar(x2, y)
我该怎么做才能让柱状图的颜色也能自动在预设的颜色中循环变化呢?
3 个回答
3
根据文档内容,来自 http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.bar
条形图的颜色不会自动循环变化,但你可以通过直接设置颜色来改变它们。可以这样做:
colors = ['red', 'blue', 'green']
i = -1
def getCycledColor():
global i, colors
if i < len(colors) -1
i = i + 1
return colors[i]
else:
i = -1
axes.bar(x1,y,facecolor=getCycledColor())
axes.bar(x2,y,facecolor=getCycledColor())
颜色可以从一个预定义的列表中选择,并且可以循环使用。
4
可选内容:要完全控制你图形的样式,可以使用现有的mplstyle作为模板:
https://github.com/matplotlib/matplotlib/tree/master/lib/matplotlib/mpl-data/stylelib
调整参数:axes.prop_cycle: cycler('color', [....])
加载你的样式:
from matplotlib import style
style.use ('PATH TO YOUR MPL STYLE')
你可以几乎以任何方式循环使用你自己的样式或默认样式的颜色:
#!/usr/bin/python
import matplotlib.pyplot as plt
#data
x=[1,2,4]
y=[11,12,8]
prop_iter = iter(plt.rcParams['axes.prop_cycle'])
for i in range(0,len(x)):
plt.bar(x[i],y[i],color=next(prop_iter)['color'])
plt.show()
plt.rcParams['axes.prop_cycle'] 会获取所有的循环,所以你需要使用键 ['color'] 来选择正确的循环器。
你可以省略创建迭代器的步骤,使用列表推导和zip来创建一行代码:
#!/usr/bin/python
import matplotlib.pyplot as plt
x=[1,2,4]
y=[11,12,8]
prop = plt.rcParams['axes.prop_cycle']
[plt.bar(param[0],param[1],color=param[2]['color']) for param in zip(x,y,prop)]
plt.show()