如何给一个pandas/ matplotlib条形图自定义颜色

我刚开始使用pandas / matplotlib来替代Excel来生成堆叠的条形图。 我遇到了一个问题

(1)默认颜色映射中只有5种颜色,所以如果我有5个以上的颜色,那么颜色会重复。 我怎样才能指定更多的颜色? 理想情况下,具有开始颜色和结束颜色的渐变,以及在两者之间dynamic生成n种颜色的方法?

(2)颜色不是非常令人满意。 如何指定一组n种颜色的自定义设置? 或者,一个梯度也可以工作。

以下两个例子说明了上述两点:

4 from matplotlib import pyplot 5 from pandas import * 6 import random 7 8 x = [{i:random.randint(1,5)} for i in range(10)] 9 df = DataFrame(x) 10 11 df.plot(kind='bar', stacked=True) 

而输出是这样的:

在这里输入图像说明

您可以直接将color选项指定为plotfunction。

 from matplotlib import pyplot as plt from itertools import cycle, islice import pandas, numpy as np # I find np.random.randint to be better # Make the data x = [{i:np.random.randint(1,5)} for i in range(10)] df = pandas.DataFrame(x) # Make a list by cycling through the colors you care about # to match the length of your data. my_colors = list(islice(cycle(['b', 'r', 'g', 'y', 'k']), None, len(df))) # Specify this list of colors as the `color` option to `plot`. df.plot(kind='bar', stacked=True, color=my_colors) 

要定义您自己的自定义列表,您可以执行以下操作中的一部分,或者查找Matplotlib技术,通过其RGB值等来定义颜色项目。您可以根据需要使用这种方法。

 my_colors = ['g', 'b']*5 # <-- this concatenates the list to itself 5 times. my_colors = [(0.5,0.4,0.5), (0.75, 0.75, 0.25)]*5 # <-- make two custom RGBs and repeat/alternate them over all the bar elements. my_colors = [(x/10.0, x/20.0, 0.75) for x in range(len(df))] # <-- Quick gradient example along the Red/Green dimensions. 

最后一个例子为我提供了简单的颜色渐变:

在这里输入图像说明

我没有玩足够长的时间来弄清楚如何强迫传说拿起定义的颜色,但我相信你可以做到这一点。

一般来说,一个很大的build议是直接使用Matplotlib中的函数。 从Pandas调用它们是可以的,但是我发现你可以从Matplotlib中获得更好的选项和性能。

我发现最简单的方法是使用.plot()colormap参数与预设的颜色渐变之一:

 df.plot(kind='bar', stacked=True, colormap='Paired') 

在这里输入图像说明

您可以在这里find大量的预设色彩地图 。

色彩映射

有关创build自己的色彩地图的更详细的答案,我强烈build议访问此页面

如果答案太多,可以快速制作自己的颜色列表,并将其传递给color参数。 所有的colormap都在cm matplotlib模块中。 让我们从反转的地狱色彩地图中得到30个RGB(加alpha)颜色值的列表。 为此,首先获取colormap并将其传递给0到1之间的一系列值。在这里,我们使用np.linspace在.4和.8之间创build30个代表np.linspace映射部分的等距值。

 from matplotlib import cm color = cm.inferno_r(np.linspace(.4,.8, 30)) color array([[ 0.865006, 0.316822, 0.226055, 1. ], [ 0.851384, 0.30226 , 0.239636, 1. ], [ 0.832299, 0.283913, 0.257383, 1. ], [ 0.817341, 0.270954, 0.27039 , 1. ], [ 0.796607, 0.254728, 0.287264, 1. ], [ 0.775059, 0.239667, 0.303526, 1. ], [ 0.758422, 0.229097, 0.315266, 1. ], [ 0.735683, 0.215906, 0.330245, 1. ], ..... 

然后我们可以用它来绘制 – 使用原始文章中的数据:

 import random x = [{i:random.randint(1,5)} for i in range(30)] df = pd.DataFrame(x) df.plot(kind='bar', stacked=True, color=color, legend=False, figsize=(12,4)) 

在这里输入图像说明