如何编辑配色方案?

How to edit a color scheme?

我正在为 Python 使用 Altair,我当前的热图代码使用的是 redyellowblue 配色方案 (A),该配色方案使用黄色作为中间色。我正在尝试编辑此配色方案以实现 (B) 上的方案,唯一的区别是将黄色替换为白色作为中间色。有人知道如何在 Altair 中实现吗?

(B) 的配色方案是在 R 中创建的,方法是使用 RdYlBu color pallete(具有 11 种颜色的那个)并用白色覆盖中间(第 6 种颜色)。然后,他们将调色板中的颜色数量增加到 99,使褪色效果看起来更流畅。

我当前的代码(A):

color=alt.Color('Spline_WW_Diff_Trend:Q', scale=alt.Scale(scheme='redyellowblue',reverse=True, domain=[-3.57,2.270], domainMid=0, clamp=True), legend=alt.Legend(title="Trend"))

我曾尝试使用范围手动设置颜色,但得到了一个奇怪的结果。我还使用了一个条件来覆盖值 0 的颜色,但它并不令人满意,因为与 0 相邻的数字应该是白色的。

您在定义自己的 range 时可能需要 interpolate='rgb'。使用 interpolate 属性 作为色标,您可以定义其中一种插值方法通过 d3 插值,https://github.com/d3/d3-interpolate#color-spaces.

插值的默认值为 hcl,这并不总是您想要的。用固定的 range/domain:

更改插值方法后,观察颜色插值的变化
import altair as alt
import pandas as pd
import numpy as np

df = pd.DataFrame({'x': np.arange(-10, 10)})

def charter(method):
  return alt.Chart(df, title=method).mark_rect().encode(
      x=alt.X('x:O',title=None),
      color=alt.Color('x:Q',
        scale=alt.Scale(
            domain=[-10,-5,0,5,9], 
            range=['red','orange','white','lightblue','darkblue'], 
            interpolate=method
            ),
        legend=alt.Legend(direction='horizontal', orient='top', title=None)
        )
      )
  
methods = ['hcl', 'rgb', 'hsl', 'hsl-long', 'lab', 'hcl-long', 'cubehelix', 'cubehelix-long']
alt.vconcat(*[charter(method) for method in methods]).resolve_scale(color='independent')