我刚开始使用pandas/matplotlib代替Excel生成堆叠条形图。我遇到了一个问题
(1) 默认颜色贴图中只有5种颜色,因此如果我有5个以上的类别,则颜色会重复。如何指定更多颜色?理想情况下,一个具有起始颜色和结束颜色的渐变,以及一种在两者之间动态生成n种颜色的方法?
②颜色不太美观。如何指定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
选项指定为直接指向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调用它们可以获得更好的选项和性能。
我发现最简单的方法是使用中的
colmap
参数。
df.plot(kind='bar', stacked=True, colormap='Paired')
您可以在此处找到大量预设颜色贴图。
要获得关于创建自己的彩色地图的更详细答案,我强烈建议访问此页面
如果这个答案太麻烦,您可以快速创建自己的颜色列表,并将它们传递给color
参数。所有颜色贴图都位于cm
matplotlib模块中。让我们从反转的地狱色贴图中获得30个RGB(加上alpha)颜色值的列表。为此,首先获取colormap,然后向其传递一个介于0和1之间的值序列。这里,我们使用np。linspace
创建30个在.4和.8之间等间距的值,表示颜色贴图的该部分。
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))