如何给熊猫/ matplotlib条形图自定义颜色


85

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

(1)默认颜色表中只有5种颜色,因此如果我的类别超过5种,则颜色会重复。如何指定更多颜色?理想情况下,具有起始颜色和结束颜色的渐变,以及在两者之间动态生成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)

输出是这样的:

在此处输入图片说明


有一种很简单的方法来获取部分色彩图。请在下面查看此解决方案
Ted Petrou

Answers:


118

您可以将color选项指定为直接指向该plot功能的列表。

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.

最后一个示例为我生成了以下简单的颜色渐变:

在此处输入图片说明

我玩的时间还不够长,无法弄清楚如何强制图例使用已定义的颜色,但是我敢肯定您可以做到。

但是,总的来说,很大的建议是直接使用Matplotlib中的函数。从Pandas调用它们是可以的,但是我发现您有更好的选择和性能,直接从Matplotlib调用它们。


3
次要错误:my_colors = [cycle(['b','r','g','y','k'])。next()for range(len(df))中的i会给出'b'每次在python 2.7中。您应该改用list(islice(cycle([(b','r','g','y','k']),None,len(df)))。
vkontori 2012年

谢谢,我可能不会明白这一点。另一种选择是先创建循环,然后next在理解内调用其功能。
2012年

对。它=周期(['b','r','g','y','k']); my_colors = [在xrange(len(df))中,i的下一个(it)]也会将其切掉……
vkontori 2012年

1
今天安装了pandas和matplotlib,上面的代码虽然可以运行,但对我来说什么也没有生成。
kakyo 2015年

@kakyo您是在常规解释器,IPython中运行,还是在外壳程序(或其他工具)中运行?根据您在其中执行此代码的环境类型,您可能需要为matplotlib打开交互模式,或pylab.ion()为交互pylab设置。
ely 2015年


15

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

如果该答案太多了,您可以快速创建自己的颜色列表并将其传递给color参数。所有的颜色图都在cmmatplotlib模块中。让我们从逆转的地狱色彩表中获取30种RGB(加alpha)色彩值的列表。为此,首先获取颜色图,然后向其传递一个介于0和1之间的值的序列。在这里,我们用来np.linspace在.4和.8之间创建30个等距的值,它们代表颜色图的该部分。

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

在此处输入图片说明


2
除以下以外,这是其他颜色图的文档inferno_rmatplotlib.org/examples/color/colormaps_reference.html
tsando

1
我遵循了此代码段,但是我的颜色数组始终具有相同的值。
FaCoffee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.