使用colormap的matplotlib条形图

18

我有一个包含两列的数据框:

  • y:y轴上不同的数值
  • days:四个不同日期的名称(星期一到星期四)

我还有一个包含四种不同颜色的调色板,这是我自己制作的ListedColorMap对象。

我想要创建一个柱状图,以周几为四个类别(x轴),它们相应的值在y轴上。同时,我希望使用我的调色板使每个条形图具有不同的颜色。

以下是我用来构建柱状图的代码:

def my_barchart(my_df, my_cmap):
  fig = plt.figure()
  ax = fig.add_axes([0,0,1,1])
  ax.bar(my_df['days'], my_df['y'], color=my_cmap)
  return fig

然而,我遇到了以下错误:“'ListedColormap'类型的对象没有len()”,这表明我没有正确使用my_cmap。

如果我从函数中删除它并运行它,我的条形图看起来还不错,只是所有的条形都有相同的颜色。所以我的问题是:如何正确地在条形图中使用colormap?

2个回答

18

color参数需要一个字符串或RGB[A]值(可以是单个颜色,也可以是每个数据点对应的一系列颜色)。颜色映射通常使用处于[0,1]范围内的浮点数进行调用。

因此,您需要将每个条形的颜色值缩放到[0,1]范围内,然后使用这些重新缩放的值调用my_cmap

例如,如果您希望颜色与y值(条形的高度)对应,则应像以下方式修改代码(假设您之前已经调用了import numpy as np):

def my_barchart(my_df, my_cmap):
    rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))

    fig = plt.figure()
    ax = fig.add_axes([0,0,1,1])
    ax.bar(my_df['days'], my_df['y'], color=my_cmap(rescale(my_df['y'])))
    return fig

这是一个自包含的最简示例,演示如何在使用输出时,使用color参数:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

my_cmap = plt.get_cmap("viridis")
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))

plt.bar(x, y, color=my_cmap(rescale(y)))
plt.savefig("temp")

输出:

输入图像说明


2
每个条形的颜色取决于它的类别(星期几),因此我认为我不能“缩放”它们,因为它们不是数字... - aprendiz

13

好的,我找到了一种方法来完成这个操作,而无需缩放我的值:

def my_barchart(my_df, my_cmap):
  fig = plt.figure()
  ax = fig.add_axes([0,0,1,1])
  ax.bar(my_df['days'], my_df['y'], color=my_cmap.colors)
  return fig

只需在 my_cmap 后面添加 .colors 即可!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接