使用Altair基于已堆叠数据无需预处理绘制正确堆叠柱状图
可以实现,直接用Altair内置的数据转换功能即可,全程不需要修改原始DataFrame。
你可以通过transform_calculate在绘图时直接计算出未检测的数量,再用transform_fold完成列转行操作,所有转换都在绘图上下文内完成,不会改动原始数据,示例代码如下:
import pandas as pd import altair as alt df = pd.DataFrame({ 'date': ['2021-01-01', '2021-02-01', '2021-03-01'], 'total': [10, 15, 20], 'tested': [0, 5, 10] }) alt.Chart(df).transform_calculate( # 内部计算未检测数量,不写入原始df untested = alt.datum.total - alt.datum.tested ).transform_fold( # 等效于pandas的melt,内部完成格式转换 ['tested', 'untested'], as_ = ['variable', 'value'] ).mark_bar().encode( x='date:O', y='value:Q', color='variable:O' )
你也可以用图层叠加的方式实现,逻辑更直观,底层绘制总数量的柱子作为未检测部分,上层叠加已检测数量的柱子,同样不需要修改原始数据:
base = alt.Chart(df).encode(x='date:O') # 底层总数量,对应未检测部分 untested_layer = base.mark_bar(color='#1f77b4').encode(y='total:Q') # 上层已检测数量 tested_layer = base.mark_bar(color='#ff7f0e').encode(y='tested:Q') # 叠加图层输出 alt.layer(untested_layer, tested_layer)
两种方法输出的堆叠柱最高高度都为对应total值,和预期效果完全一致。
内容的提问来源于stack exchange,提问作者felipecrp
相关产品推荐
相关产品推荐

