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

如何用Altair绘制从100向下延伸的条形图?

实现Altair中以100为原点的条形图

嘿,这个问题我之前也帮人捋过,Altair的严格数据驱动逻辑确实和Matplotlib那种灵活调整刻度的思路不一样,但完全有办法实现你要的“从100向下/向上延伸”的条形图,给你两个实用方案:

方案一:直接用y2固定基线(最直观)

这个方法不需要修改原始数据,直接通过编码让条形的一端固定在100的位置,另一端延伸到你的value值。本质是把每个条形的起点设为100,终点是数据里的数值,完美贴合你的需求:

import altair as alt
import pandas as pd

data = pd.DataFrame({
    'num': [0, 1],
    'value': [80, 120],
})

chart = alt.Chart(data).mark_bar().encode(
    x='num:O',  # 把num当作分类变量,让条形更规整
    y=alt.Y(
        'value:Q',
        scale=alt.Scale(domain=[60, 140]),  # 可根据你的数据范围调整
        title='value'
    ),
    y2=alt.value(100),  # 核心:把条形的基线固定在100
    # 可选:给不同方向的条形加颜色区分
    color=alt.condition(
        alt.datum.value > 100,
        alt.value('seagreen'),
        alt.value('crimson')
    )
)

chart.show()

方案二:数据变换+自定义刻度标签

如果需要对偏移量做额外计算(比如统计偏离100的幅度),可以先把数据转换成相对于100的差值,再通过轴标签把刻度转回到原始数值,这有点像你在Matplotlib里的思路,但适配了Altair的逻辑:

import altair as alt
import pandas as pd

data = pd.DataFrame({
    'num': [0, 1],
    'value': [80, 120],
})

chart = alt.Chart(data).transform_calculate(
    delta = alt.datum.value - 100  # 计算每个值与100的差值
).mark_bar().encode(
    x='num:O',
    y=alt.Y(
        'delta:Q',
        scale=alt.Scale(domain=[-40, 40]),  # 对应原数值60-140的范围
        axis=alt.Axis(
            tickCount=5,
            labelExpr='datum.value + 100',  # 把差值刻度转成原始数值标签
            title='value'
        )
    ),
    color=alt.condition(
        alt.datum.delta > 0,
        alt.value('seagreen'),
        alt.value('crimson')
    )
)

chart.show()

两种方法都能实现你要的效果,个人更推荐第一种,不需要折腾数据,完全利用Altair的编码能力就搞定了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:02:48