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
相关产品推荐
相关产品推荐

