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

Altair:使用resolve_scale合并颜色形状后如何合并重复图例

Altair多图拼接后重复图例的解决办法

问题描述

绘制带点标记的多线图系列,用颜色、形状和stroke dash区分类别。单图使用resolve_scale时显示正常,但将不同Y值的图表拼接后出现重复图例。

单图代码:

import numpy as np
import pandas as pd
import altair as alt

x = np.arange(0, 5, 0.1)
mask = np.ones_like(x)
mask[::2] = 0
df = pd.DataFrame({
    "x": x, 
    "y": np.sin(x)*mask + np.cos(x)*(1-mask),
    "y2": np.sin(2*x)*mask + np.cos(2*x)*(1-mask) ,
    "col": mask
})
base= alt.Chart(df).mark_line(point=True, size=1).encode(
    alt.X("x:Q"),
    color = alt.Color("col:N"),
    shape = alt.Shape("col:N"),
    strokeDash = alt.StrokeDash("col:N")
).resolve_scale(color="independent",  shape="independent", strokeDash="independent")

# 单图显示正常
base.encode(alt.Y("y:Q"))

单图效果

拼接操作后出现重复图例:

base.encode(alt.Y("y:Q")) | base.encode(alt.Y("y2:Q"))

拼接后带重复图例的图表

已知resolve_scale的独立缩放特性会导致此问题,若不在单图使用该方法或直接在拼接图上使用,会导致图例中各可视化属性拆分显示,需解决重复图例问题。

解决方案

方案1:在复合图表层面统一配置缩放与图例

移除单图的resolve_scale,改为在拼接后的复合图表上设置共享缩放,同时将形状、strokeDash的图例绑定到颜色图例:

# 重新定义基础图表,不设置resolve_scale
base = alt.Chart(df).mark_line(point=True, size=1).encode(
    alt.X("x:Q"),
    # 保留颜色图例,将形状和strokeDash的图例隐藏
    color=alt.Color("col:N", legend=alt.Legend(title="类别")),
    shape=alt.Shape("col:N", legend=None),
    strokeDash=alt.StrokeDash("col:N", legend=None)
)

# 拼接图表后设置共享缩放
combined = base.encode(alt.Y("y:Q")) | base.encode(alt.Y("y2:Q"))
combined = combined.resolve_scale(
    color="shared",
    shape="shared",
    strokeDash="shared"
)
combined

方案2:使用Repeat功能生成多图表(更简洁)

将数据转换为长格式,利用Altair的repeat功能自动处理图例共享:

# 转换为长格式数据
df_long = df.melt(
    id_vars=["x", "col"], 
    value_vars=["y", "y2"], 
    var_name="y_series", 
    value_name="value"
)

chart = alt.Chart(df_long).mark_line(point=True, size=1).encode(
    alt.X("x:Q"),
    alt.Y("value:Q"),
    color=alt.Color("col:N", legend=alt.Legend(title="类别")),
    shape=alt.Shape("col:N"),
    strokeDash=alt.StrokeDash("col:N")
).repeat(
    column=["y", "y2"]  # 按Y系列生成并列图表
).resolve_scale(
    y="independent"  # 保持Y轴独立
)
chart

原理说明

  • 单图设置resolve_scale(..., independent)会让每个图表生成独立图例,拼接后自然重复。
  • 在复合图表层面设置shared缩放,同时隐藏多余的形状、strokeDash图例,可实现属性绑定且只保留一个合并图例。
  • 使用repeat时,Altair会自动管理图例共享,无需手动拼接,代码更简洁且避免重复图例问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:25