Matplotlib:条形图,每个条上都有颜色渐变。错误:TypeError:“ListedColormap”类型的对象没有 len()

Fri*_*ant 1 matplotlib bar-chart python-3.x colormap

我愿意生成这样的情节:在此处输入图片说明

我无法将颜色图定义为每个条的颜色。我怎样才能做到这一点?我编写了以下代码:

import matplotlib.pyplot as plt
quiz=[1,2,0,4,8,10]
plt.barh(range(len(quiz)), quiz, align='center', alpha=0.5, color='blue')
Run Code Online (Sandbox Code Playgroud)

它有效,但所有条形都只有一种颜色(此处为蓝色)。如何使用颜色图作为颜色?

color=plt.cm.get_cmap('bwr')
Run Code Online (Sandbox Code Playgroud)

给出一个

Error: TypeError: object of type 'ListedColormap' has no len()
Run Code Online (Sandbox Code Playgroud)

编辑:这篇文章给出了一些提示,但没有告诉我如何使颜色渐变对应于 x 值:如何用渐变填充 matplotlib 条?

Fri*_*ant 5

所以,受到 Thomas Kühn 评论的启发,我得到了一个解决方案(不确定它是最干净的,但它有效)。

它基本上将具有渐变的图像放在初始水平条形图上。ax.imshow() 默认对给定值进行标准化。因此,为了使梯度依赖于 x 值,我们需要使用选项 norm=mpl.colors.NoNorm(vmin=0,vmax=1) 去除这种强制归一化:

    fig, ax = plt.subplots()
data=[4,5,6,3,7,5]  
bar = ax.barh(range(len(data)),data)
def gradientbars(bars):

      ax = bars[0].axes
      lim = ax.get_xlim()+ax.get_ylim()
      for bar in bars:

          bar.set_zorder(1)
          bar.set_facecolor("none")
          x,y = bar.get_xy()
          w, h = bar.get_width(), bar.get_height()
          grad = np.atleast_2d(np.linspace(0,1*w/max(data),256))
          ax.imshow(grad, extent=[x,x+w,y,y+h], aspect="auto", zorder=0, norm=mpl.colors.NoNorm(vmin=0,vmax=1))
      ax.axis(lim)


gradientbars(bar)
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明

您还可以使用 ax.imshow() 中的选项 cmap 更改颜色图。(例如:cmap=plt.get_cmap('coolwarm'))。