如何按列值对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
相关产品推荐
相关产品推荐

