Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为pandas/matplotlib条形图提供自定义颜色_Python_Matplotlib_Pandas - Fatal编程技术网

Python 如何为pandas/matplotlib条形图提供自定义颜色

Python 如何为pandas/matplotlib条形图提供自定义颜色,python,matplotlib,pandas,Python,Matplotlib,Pandas,我刚开始使用pandas/matplotlib代替Excel生成堆叠条形图。我遇到了一个问题 (1) 默认颜色贴图中只有5种颜色,因此如果我有5个以上的类别,则颜色会重复。如何指定更多颜色?理想情况下,一个具有起始颜色和结束颜色的渐变,以及一种在两者之间动态生成n种颜色的方法 (2) 这些颜色在视觉上不是很好看。如何指定一组自定义的n种颜色?或者,梯度也可以 下面是一个说明上述两点的示例: 4 from matplotlib import pyplot 5 from pandas imp

我刚开始使用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)
输出是这样的:


您可以将
颜色
选项指定为一个列表,直接用于
绘图
功能

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.

my_colors=['g','b']*5.我发现最简单的方法是使用
.plot()
中的
colormap
参数和一个预设的颜色渐变:

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

小错误:my_colors=[循环(['b','r','g','y','k'])。在python 2.7中,范围内i(len(df))]的next()每次都会给出'b'。您应该使用list(islice(cycle(['b','r','g','y','k']),None,len(df))。谢谢,我可能不会注意到这一点。另一个选项是先创建循环,然后在consulation.Yup中调用其
next
函数。它=周期(['b','r','g','y','k']);my_colors=[next(it)for i in xrange(len(df))]也会剪切它……今天安装了pandas和matplotlib,上面的代码不会为我生成任何东西,尽管它运行。@kakyo您是在常规解释器IPython中运行,还是在shell(或其他什么)中运行?根据您在其中执行此代码的环境类型,您可能需要为matplotlib启用交互模式,或为交互pylab设置
pylab.ion()
。有一种非常简单的方法可以获得部分颜色贴图。在我的例子中,这只会在所有的barsI中产生一种颜色。我发现这些颜色映射列表很有用。这是除了
inferno\r
之外的其他颜色映射的文档:我遵循了这个片段,但我的颜色数组始终具有相同的值。