如何让散景从 3 种颜色插入调色板

How to get Bokeh to interpolate a palette from 3 colors

我在 Bokeh 中构建了一个热图,效果很好。我希望它的颜色从鲜绿色到鲜红色,连续不断。当前代码为:

colors = ["#66ff00", "#FFFFFF", "#FF0000"]
colors.reverse()
mapper = LinearColorMapper(palette=colors, low=-50, high=50)

p.rect(..., fill_color=transform('percentage', mapper))

问题是热图中只出现了 3 种颜色。我希望 -50 到 50 之间的所有值都可以线性插入亮红色到白色到亮绿色之间的值,并显示在热图中。我怎样才能做到这一点?

从版本 2.3.1 开始,palettes 只是颜色列表,当前现有的颜色映射器只是使用给定的调色板,而不修改它们。如果您想要更多颜色,则需要在将调色板(颜色列表)传递给 Bokeh 之前将其插入到您想要的任何大小。 LinearColorMapper 中的“线性”指的是 如何线性映射到调色板定义的容器中。

当前接受的答案是绝对正确的,我只是认为任何发现这个的人都可以使用解决他们问题的有效解决方案。

使用 matplotlib you can create a linear segmented colormap:

colors = ["darkorange", "gold", "lawngreen", "lightseagreen"]
cmap1 = matplotlib.colors.LinearSegmentedColormap.from_list("mycmap", colors)

如果您的颜色不应该沿着范围均匀分布,您也可以定义它们的位置:

colors = ["darkorange", "gold", "lawngreen", "lightseagreen"]
nodes = [0.0, 0.4, 0.8, 1.0]
cmap2 = matplotlib.colors.LinearSegmentedColormap.from_list("mycmap", list(zip(nodes, colors)))

从这里您可以像处理任何内置线性分段颜色图(如铜)一样处理此颜色图。例如,您可以从颜色图的 25%-90% 范围内导出 192 种颜色的列表,如下所示:

palette = [matplotlib.colors.rgb2hex(c) for c in cmap1(np.linspace(0.25, 0.9, 192))]

然后您可以在您喜欢的任何图表解决方案中使用此调色板。

编辑: 由于我也经常需要完全相同的功能,因此我为此创建了一个函数。

代码本身:

def get_palette(cmap='Greys', n=192, start=0, end=1):
  import matplotlib, numpy as np

  linspace = np.linspace(start, end, n)

  if isinstance(cmap, list):
    cmap = matplotlib.colors.LinearSegmentedColormap.from_list("customcmap", cmap)
    palette = cmap(linspace)
  elif isinstance(cmap, str):
    cmap = matplotlib.pyplot.cm.get_cmap(cmap)
    palette = cmap(linspace)
  else:
    palette = cmap(linspace)

  hex_palette = [matplotlib.colors.rgb2hex(c) for c in palette]
  return hex_palette