我有一个包含两列的 df:
我还有一个我自己制作的具有四种不同颜色的颜色图,它是一个 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
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:“'ListedColormap' 类型的对象没有 len()”,所以我似乎没有正确使用 my_cmap。
如果我从函数中删除它并运行它,我的条形图看起来不错,只是所有条形都具有相同的颜色。所以我的问题是:在条形图上使用颜色图的正确方法是什么?
apr*_*diz 14
好吧,我找到了一种方法来做到这一点,而无需调整我的价值观:
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
Run Code Online (Sandbox Code Playgroud)
.colors
只需在工作后添加即可my_cmap
!
该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
Run Code Online (Sandbox Code Playgroud)
这是一个自包含的最小示例,将color
参数与 a 的输出一起使用cmap
:
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")
Run Code Online (Sandbox Code Playgroud)
输出: