You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按列值对Altair多特征散点图的颜色进行分组?

解决同大类同色系的散点图颜色分组问题

你的方向没走错,只是需要结合自定义颜色映射或者派生字段+多维度颜色编码来实现需求。下面给两种可行的方案:

方案一:直接指定每个细分类别的同色系颜色

既然你明确知道6个分类值,直接在color编码里自定义scale的domain和range,把同大类的细分值对应到同色系的明暗色即可:

import altair as alt
import pandas as pd

# 模拟你的数据集(替换成你实际的数据)
source = pd.DataFrame({
    'sepalLength': [5.1, 4.9, 6.2, 5.9, 6.3, 5.8],
    'sepalWidth': [3.5, 3.0, 2.8, 3.2, 3.3, 2.7],
    'petalWidth': [0.2, 0.2, 1.4, 1.5, 2.5, 2.1],
    'species': ['setosa-bright', 'setosa-dull', 'versicolor-bright', 'versicolor-dull', 'virginica-bright', 'virginica-dull']
})

alt.Chart(source).mark_circle().encode(
    alt.X('sepalLength').scale(zero=False),
    alt.Y('sepalWidth').scale(zero=False, padding=1),
    color=alt.Color('species').scale(
        domain=[
            'setosa-bright', 'setosa-dull',
            'versicolor-bright', 'versicolor-dull',
            'virginica-bright', 'virginica-dull'
        ],
        range=[
            '#1f77b4', '#aec7e8',  # 蓝色系:亮蓝、浅蓝
            '#2ca02c', '#98df8a',  # 绿色系:亮绿、浅绿
            '#ff4b5c', '#ff9aa2'   # 红色系:亮红、浅红
        ]
    ),
    size='petalWidth'
)

方案二:拆分字段,用色调+亮度自动生成同色系

先通过数据转换拆分出大类和明暗标签,再把大类映射到颜色的色调(hue),明暗标签映射到亮度(lightness),自动生成同色系的深浅效果:

import altair as alt
import pandas as pd

source = pd.DataFrame({
    'sepalLength': [5.1, 4.9, 6.2, 5.9, 6.3, 5.8],
    'sepalWidth': [3.5, 3.0, 2.8, 3.2, 3.3, 2.7],
    'petalWidth': [0.2, 0.2, 1.4, 1.5, 2.5, 2.1],
    'species': ['setosa-bright', 'setosa-dull', 'versicolor-bright', 'versicolor-dull', 'virginica-bright', 'virginica-dull']
})

alt.Chart(source).transform_calculate(
    # 从species字段拆分出大类(比如setosa、versicolor)
    category=alt.expr.split(alt.datum.species, '-')[0],
    # 拆分出明暗标签(bright/dull)
    shade=alt.expr.split(alt.datum.species, '-')[1]
).mark_circle().encode(
    alt.X('sepalLength').scale(zero=False),
    alt.Y('sepalWidth').scale(zero=False, padding=1),
    # 大类绑定色调,明暗绑定亮度,自动生成同色系深浅
    color=alt.Color('category:N', hue=True, lightness='shade:N').scale(
        # 可选:指定大类的基础色调
        range=['#1f77b4', '#2ca02c', '#ff7f0e']
    ),
    size='petalWidth'
)

补充说明

你之前查看的颜色域与范围的文档是正确的方向,方案一就是直接应用那部分的知识,只是需要为每个细分分类值匹配同色系的颜色;方案二则是通过数据转换拆分字段,利用Altair的多维度颜色编码能力,让同大类自动保持色调一致,仅用亮度区分明暗。

内容的提问来源于stack exchange,提问作者vtnate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:05:12