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

如何用Altair绘制正负值分色的面积图?

解决Altair绘制正负区域不同颜色的面积图问题

我之前也碰到过类似的困扰,直接用alt.condition给mark_area设置颜色确实达不到预期效果——因为面积图的颜色编码是针对整个图层的,没法自动根据Y值正负拆分区域填充。最稳妥的办法是把正负数据拆分开,用两个图层分别绘制,再叠加到一起。

下面是修改后的完整代码,保留了你原来的brush联动功能:

import altair as alt
import pandas as pd

# 先预处理数据:拆分正负值部分
plot_data = yData['plotY'].fillna(0).reset_index()[24000:26000]
# 正值部分:大于0的保留,否则设为0
plot_data['positive'] = plot_data['plotY'].where(plot_data['plotY'] > 0, 0)
# 负值部分:小于0的保留,否则设为0
plot_data['negative'] = plot_data['plotY'].where(plot_data['plotY'] < 0, 0)

brush = alt.selection(type='interval', encodings=['x'])

# 绘制正值面积图
upper_positive = alt.Chart(plot_data, title='_name').mark_area(color='steelblue').encode(
    x=alt.X(f"{plot_data.columns[0]}:T", scale=alt.Scale(domain=brush)),
    y='positive:Q',
    tooltip=['plotY']
)

# 绘制负值面积图
upper_negative = alt.Chart(plot_data).mark_area(color='orange').encode(
    x=alt.X(f"{plot_data.columns[0]}:T", scale=alt.Scale(domain=brush)),
    y='negative:Q',
    tooltip=['plotY']
)

# 叠加两个图层作为上部图表
upper = upper_positive + upper_negative
upper = upper.properties(width=700, height=230)

# 下部的brush选择图,直接复用叠加后的图层
lower = upper.copy().properties(height=20).add_selection(brush)

# 拼接上下图
p = alt.vconcat(upper, lower).configure_concat(spacing=0)
p

关键说明:

  • 数据拆分:用pandas.Series.where方法把原数据拆成正值和负值两个列,这样每个图层只负责自己区域的填充。
  • 图层叠加:把两个面积图图层相加,Altair会自动处理它们的堆叠关系,正值在上、负值在下(因为负值的Y值是向下延伸的)。
  • 保留联动:上下图的X轴缩放都绑定同一个brush选择,保持你原来的交互功能。

这样修改后,就能得到Y轴正负区域颜色不同的面积图啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:47