在matplotlib Python中设置不同的栏颜色

假设,我有如下的条形图:

BarPlot

任何想法如何为每个载体设置不同的颜色? 例如,AK是红色的,GA是绿色的,等等?

我在Python中使用pandas和matplotlib

>>> f=plt.figure() >>> ax=f.add_subplot(1,1,1) >>> ax.bar([1,2,3,4], [1,2,3,4]) <Container object of 4 artists> >>> ax.get_children() [<matplotlib.axis.XAxis object at 0x6529850>, <matplotlib.axis.YAxis object at 0x78460d0>, <matplotlib.patches.Rectangle object at 0x733cc50>, <matplotlib.patches.Rectangle object at 0x733cdd0>, <matplotlib.patches.Rectangle object at 0x777f290>, <matplotlib.patches.Rectangle object at 0x777f710>, <matplotlib.text.Text object at 0x7836450>, <matplotlib.patches.Rectangle object at 0x7836390>, <matplotlib.spines.Spine object at 0x6529950>, <matplotlib.spines.Spine object at 0x69aef50>, <matplotlib.spines.Spine object at 0x69ae310>, <matplotlib.spines.Spine object at 0x69aea50>] >>> ax.get_children()[2].set_color('r') #You can also try to locate the first patches.Rectangle object instead of direct calling the index. 

对于上面的build议,我们到底该如何枚举ax.get_children()并检查对象types是否为矩形? 所以如果对象是矩形,我们会分配不同的随机颜色?

简单,只需使用.set_color

 >>> barlist=plt.bar([1,2,3,4], [1,2,3,4]) >>> barlist[0].set_color('r') >>> plt.show() 

在这里输入图像说明

对于你的新问题,也没有太大的困难,只需要从你的坐标轴上find一个例子:

 >>> f=plt.figure() >>> ax=f.add_subplot(1,1,1) >>> ax.bar([1,2,3,4], [1,2,3,4]) <Container object of 4 artists> >>> ax.get_children() [<matplotlib.axis.XAxis object at 0x6529850>, <matplotlib.axis.YAxis object at 0x78460d0>, <matplotlib.patches.Rectangle object at 0x733cc50>, <matplotlib.patches.Rectangle object at 0x733cdd0>, <matplotlib.patches.Rectangle object at 0x777f290>, <matplotlib.patches.Rectangle object at 0x777f710>, <matplotlib.text.Text object at 0x7836450>, <matplotlib.patches.Rectangle object at 0x7836390>, <matplotlib.spines.Spine object at 0x6529950>, <matplotlib.spines.Spine object at 0x69aef50>, <matplotlib.spines.Spine object at 0x69ae310>, <matplotlib.spines.Spine object at 0x69aea50>] >>> ax.get_children()[2].set_color('r') #You can also try to locate the first patches.Rectangle object #instead of direct calling the index. 

如果你有一个复杂的阴谋,并希望首先确定酒吧,添加这些:

 >>> import matplotlib >>> childrenLS=ax.get_children() >>> barlist=filter(lambda x: isinstance(x, matplotlib.patches.Rectangle), childrenLS) [<matplotlib.patches.Rectangle object at 0x3103650>, <matplotlib.patches.Rectangle object at 0x3103810>, <matplotlib.patches.Rectangle object at 0x3129850>, <matplotlib.patches.Rectangle object at 0x3129cd0>, <matplotlib.patches.Rectangle object at 0x3112ad0>] 

我假设你正在使用Series.plot()来绘制你的数据。 如果您在这里查看Series.plot()的文档:

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.plot.html

没有列出颜色参数,您可以在其中设置条形图的颜色。

但是,Series.plot()文档在参数列表的末尾指出了以下内容:

 kwds : keywords Options to pass to matplotlib plotting method 

这意味着当你指定Series.plot()的kind参数为bar时 ,Series.plot()实际上会调用matplotlib.pyplot.bar(),而matplotlib.pyplot.bar()将被发送所有的额外您可以在Series.plot()的参数列表的末尾指定关键字参数。

如果您在这里检查matplotlib.pyplot.bar()方法的文档:

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

也可以在参数列表的末尾接受关键字参数,如果您仔细阅读可识别的参数名称列表,其中一个是颜色 ,可以是一个指定您的条形图的不同颜色的序列。

综合起来,如果在Series.plot()参数列表的末尾指定color关键字参数,那么关键字参数将被中继到matplotlib.pyplot.bar()方法。 这是certificate:

 import pandas as pd import matplotlib.pyplot as plt s = pd.Series( [5, 4, 4, 1, 12], index = ["AK", "AX", "GA", "SQ", "WN"] ) #Set descriptions: plt.title("Total Delay Incident Caused by Carrier") plt.ylabel('Delay Incident') plt.xlabel('Carrier') #Set tick colors: ax = plt.gca() ax.tick_params(axis='x', colors='blue') ax.tick_params(axis='y', colors='red') #Plot the data: my_colors = 'rgbkymc' #red, green, blue, black, etc. pd.Series.plot( s, kind='bar', color=my_colors, ) plt.show() 

在这里输入图像说明

请注意,如果序列中的条纹多于颜色,则会重复颜色。

更新pandas0.17.0

@ 7stud对最新的pandas版本的回答只需要打电话

 s.plot( kind='bar', color=my_colors, ) 

代替

 pd.Series.plot( s, kind='bar', color=my_colors, ) 

绘图函数已经成为Series,DataFrame对象的成员, 实际上用color参数调用pd.Series.plot会给出一个错误