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

Altair多行轴标签导致堆叠条形图异常问题求助

堆叠条形图多行Y轴标签异常问题排查与解决

问题描述

使用Altair 5.0.0绘制堆叠条形图时,用textwrap.wrap生成列表作为Y轴标签,出现了条形拆分、堆叠结构混乱的异常(如图所示)。

复现代码

import altair as alt
from vega_datasets import data
import textwrap

source = data.barley()
source['multiline_label'] = source['variety'].apply(textwrap.wrap, args=[5])

alt.Chart(source).mark_bar().encode(
    x=alt.X('sum(yield)').stack("normalize"),
    y='multiline_label',
    color='site'
)

异常效果

异常堆叠条形图

问题原因

Altair的离散型分类轴(这里Y轴对应分类数据)会把列表类型的字段识别为嵌套分类,而非多行文本标签。每个列表元素都会被当作独立的分类项,导致原本属于同一品种的条形被拆分到不同行,堆叠逻辑完全混乱。

解决办法

方法一:将列表转为带分隔符的字符串,通过轴配置实现多行显示

把textwrap.wrap生成的列表转为带<br>或换行符的字符串,再利用轴配置拆分字符串实现多行标签:

import altair as alt
from vega_datasets import data
import textwrap

source = data.barley()
# 把列表转为用<br>分隔的字符串
source['multiline_label'] = source['variety'].apply(lambda x: '<br>'.join(textwrap.wrap(x, 5)))

alt.Chart(source).mark_bar().encode(
    x=alt.X('sum(yield)').stack("normalize"),
    # 通过labelExpr拆分字符串为多行
    y=alt.Y('multiline_label', axis=alt.Axis(labelExpr="split(datum.label, '<br>')")),
    color='site'
)

如果用'\n'作为分隔符,Altair 5.0+支持直接设置axis.labelLineBreak=True,无需写labelExpr:

source['multiline_label'] = source['variety'].apply(lambda x: '\n'.join(textwrap.wrap(x, 5)))

alt.Chart(source).mark_bar().encode(
    x=alt.X('sum(yield)').stack("normalize"),
    y=alt.Y('multiline_label', axis=alt.Axis(labelLineBreak=True)),
    color='site'
)

方法二:在图表层面通过transform处理文本换行(无需修改原始数据)

利用transform_calculate用正则拆分文本,直接在轴配置中设置多行显示:

import altair as alt
from vega_datasets import data

source = data.barley()

alt.Chart(source).mark_bar().encode(
    x=alt.X('sum(yield)').stack("normalize"),
    # 按正则每5个字符拆分文本为多行
    y=alt.Y('variety', axis=alt.Axis(labelExpr="split(datum.label, /(?<=.{5})/)")),
    color='site'
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:13