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

