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

vas*_*ek1 72 python matplotlib pandas

我刚开始使用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)
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

在此输入图像描述

ely*_*ely 99

您可以将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)
Run Code Online (Sandbox Code Playgroud)

要定义自己的自定义列表,您可以执行以下操作,或者只查看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.
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我没有玩足够长的时间来弄清楚如何强制传奇来获取定义的颜色,但我相信你能做到.

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

  • 小错误:my_colors = [cycle(['b','r','g','y','k']).next()for i in range(len(df))]将给出'b'每次都在python 2.7.你应该使用list(islice(cycle(['b','r','g','y','k']),None,len(df))). (3认同)

Ale*_*dre 45

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

df.plot(kind='bar', stacked=True, colormap='Paired')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以在此处找到大量预设色彩映射.

色彩映射

  • 在我的情况下,这只会在所有条形上产生一种颜色 (11认同)

Ted*_*rou 12

有关创建自己的色彩映射的更详细答案,我强烈建议您访问此页面

如果答案太多,您可以快速制作自己的颜色列表并将其传递给color参数.所有的色彩映射都在cmmatplotlib模块中.让我们从反转的inferno色彩图中得到30个RGB(加alpha)颜色值的列表.为此,首先获取colormap并将其传递给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.      ],
       .....
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用它来绘制 - 使用原始帖子中的数据:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我遵循了这个片段,但我的颜色数组始终具有相同的值。 (3认同)
  • 这是除`inferno_r`之外的其他颜色映射的文档:https://matplotlib.org/examples/color/colormaps_reference.html (2认同)