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直接调用它们获得更好的选择和性能.
Ale*_*dre 45
我发现最简单的方法是使用其中一个预设颜色渐变的colormap参数.plot():
df.plot(kind='bar', stacked=True, colormap='Paired')
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
84615 次 |
| 最近记录: |