如何从 matplotlib 颜色图中提取 "extreme" 两种颜色?

How to extract the "extreme" two colours from a matplotlib colormap?

我正在阅读和测试 seaborn palette tutorial。 我会对基于预定义 matplotlib 颜色图的深色发散调色板感兴趣。那可能吗? (这在所有情况下都有意义吗?)

因为我实际上只想要 3 种颜色,"black" 是中间的一种,我可以提取调色板的第一个和最后一个,如下所示:

import seaborn as sns

left = sns.color_palette("BrBG")[0]
right = sns.color_palette("BrBG")[-1]
sns.palplot([left, "black", right])

我看到如果我增加源调色板中的元素数量,我可以获得更深的左右颜色:

left = sns.color_palette("BrBG", 12)[0]
right = sns.color_palette("BrBG", 12)[-1]
sns.palplot([left, "black", right])

我想知道如果我增加元素的数量,左右颜色可以变深多少。我想他们最终不会是黑色的,否则这两个极端就变得无法区分了。

是否可以直接从相应的 matplotlib 颜色图中提取这些 "extreme" 颜色?

我也可以使用较浅的颜色,要求调色板中的元素少于默认值(6 个)。要求 2 个元素导致我觉得太清淡了:

left = sns.color_palette("BrBG", 2)[0]
right = sns.color_palette("BrBG", 2)[-1]
sns.palplot([left, "black", right])

总之,这种方法不是很"clean",颜色图的极端不一定是好的选择。此外,概括可能有用:How to create a dark diverging palette with more than 3 colours, based on a predefined colormap?

上面提到的教程说创建 custom diverging palettes 的函数会产生很好的平衡,并给出了以下示例:

sns.palplot(sns.diverging_palette(255, 133, l=60, n=7, center="dark")

我想我的问题如下:

如何找到与预定义 matplotlib 颜色图两侧的色调对应的角度值?

受到 的启发,我尝试了以下方法:

import matplotlib as mpl
cmap = mpl.cm.get_cmap("BrBG")
left = cmap(0)
right = cmap(cmap.N)
sns.palplot([left, "black", right])

所以我现在有了部分答案。而且看起来太黑了。

编辑:在 husl 系统中获取颜色的角度

答案就在husl模块中:https://pypi.python.org/pypi/husl/

import husl
# Extract rgb coordinates
left_rgb = cmap(0)[:-1]
right_rgb = cmap(cmap.N)[:-1]
# Convert to husl and take the hue (first element)
left_hue = husl.rgb_to_husl(*left_rgb)[0]
right_hue = husl.rgb_to_husl(*right_rgb)[0]
# Create the palette and plot it
sns.palplot(sns.diverging_palette(left_hue, right_hue, n=3, center="dark"))