如何在 altair.layered 图中配置条形图?

Posted

技术标签:

【中文标题】如何在 altair.layered 图中配置条形图?【英文标题】:How to configure bars in a altair.layered plot? 【发布时间】:2021-04-19 16:48:02 【问题描述】:

在使用 streamlit 时,我开始使用 altair 绘制数据。在使用它时,我偶然发现了以下问题:

我想绘制一个具有以下结构的 DataFrame:

workload_df = pd.DataFrame(
    'index': pd.to_datetime(['01.02.2010', '01.03.2010', '01.04.2010']),
    'measure': [100, 90, 120],
    'measure_max': [80, 100, 150],
)

现在我想将度量与条形图中的 max_measure 进行比较:

measure_max_plot = alt.Chart(workload_df).mark_bar(color = 'lightgreen', text = 'measure_max').encode(
        alt.X('index', title = '', axis = alt.Axis(labelAngle = -45, labelOverlap = False)),
        alt.Y('measure_max', title = '')
)

measure_plot = alt.Chart(workload_df).mark_bar(text = 'measure').encode(
   x = alt.X('index', title = 'X', axis = alt.Axis(labelAngle = -45, labelOverlap = False)), 
   y = alt.Y('measure', title = 'Y'),

   color=alt.condition(
       alt.datum.measure > alt.datum.measure_max,  
       alt.value('red'),     
       alt.value('steelblue')   
   )
)
altair_plot = alt.layer(measure_max_plot, measure_plot)
st.altair_chart(altair_plot, use_container_width=True)

我得到这样的东西:

或类似的东西:

但我希望最高的栏总是在后台,所以像这样:

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

层总是按照层图中指定的顺序显示。在您的情况下,您想要measure_max_plot 下面显示的measure_plot 的一部分,以及上面显示的部分。您可以通过过滤和添加另一层来做到这一点:

altair_plot = alt.layer(
    measure_plot.transform_filter(alt.datum.measure > alt.datum.measure_max),
    measure_max_plot,
    measure_plot.transform_filter(alt.datum.measure < alt.datum.measure_max)
)

【讨论】:

非常感谢。我几乎整天都在寻找解决方案。

以上是关于如何在 altair.layered 图中配置条形图?的主要内容,如果未能解决你的问题,请参考以下文章

spss如何删除堆积条形图中的某块数据

如何在堆积条形图中的每个条形上添加值[重复]

d3.js 如何在条形图中添加线条

更改刻度名称后,如何修复 seaborn 条形图中缺少的条形?

如何按升序对条形图中的条形进行排序

如何改变条形图中的条形顺序?