开发者

How do I make bar plots automatically cycle across different colors?

In matplotlib, line plots color cycle automatically. These two line plots 开发者_Python百科would have different colors.

axes.plot(x1, y)
axes.plot(x2, y)

However, bar plots don't. Both these data series will have blue bars.

axes.bar(x1, y)
axes.bar(x2, y)

How do I make bar plots cycle automatically across a predefined set of colors?


Would something along these lines do it for you?

#!/usr/bin/python 
from matplotlib import cm
import matplotlib.pyplot as plt

#data
x=[1,2,4]
y=[11,12,8]

for i in range(0,len(x)):
  plt.bar(x[i],y[i],color=cm.jet(1.*i/len(x)))

plt.show()

More on colormaps.

EDIT: See this example for how to cycle over a predefined set of colors.



Optional: To get full control over the style of your figures use an existing mplstyle as a template: https://github.com/matplotlib/matplotlib/tree/master/lib/matplotlib/mpl-data/stylelib

adjust the parameter : axes.prop_cycle: cycler('color', [....])

load your style:

from matplotlib import style
style.use ('PATH TO YOUR MPL STYLE')

You can cycle through your or the default style color cycle almost any way you want:

#!/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'] grabs all cycles so you need to select the correct cycler using the key ['color'].

You can drop the iterator creation and use list comprehension and zip to create one liners:

#!/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()

enter image description here


From the documentation at http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.bar

The bar plots do not cycle color automatically but you could set the color directly by passing the color properties. Something like this:

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

The colors can be chosen from a predefined list and cycled.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜