首页 > 解决方案 > 如何通过 Altair 图表中的条件选择部分数据

问题描述

我想过滤我在某个条件下拥有的一部分数据。Altair 可以吗?

我正在使用下面的代码来绘制图表。

alt.Chart(deliveries).mark_bar().encode(
    alt.X('batsman', sort=alt.EncodingSortField(field='sum(batsman_runs)', op='count', order='descending')),
    alt.Y('sum(batsman_runs)'),
    tooltip=['batsman', 'sum(batsman_runs)']
).properties(height=600, width=3000).interactive()

但由于这有很多数据,所以我的图表中有很多条形图。我想通过给出一个条件来限制图表中的条形图,例如显示得分超过 4000 次的击球手的数据。

我尝试使用 transform_filter(),但不能使用聚合函数(我在这里使用'sum')。

alt.Chart(deliveries).mark_bar().encode(
    alt.X('batsman', sort=alt.EncodingSortField(field='sum(batsman_runs)', op='count', order='descending')),
    alt.Y('sum(batsman_runs)'),
    tooltip=['batsman', 'sum(batsman_runs)']
).properties(height=600, width=3000).interactive().transform_filter(datum.sum(batsman_runs) > 4000)

有没有办法通过给出条件来实现过滤所需数据的功能?

标签: pythondata-visualizationaltair

解决方案


为了在过滤器变换中引用聚合,需要在聚合变换中而不是在编码速记中进行计算。

像这样的东西应该工作:

alt.Chart(deliveries).transform_aggregate(
    total_runs='sum(batsman_runs)',
    groupby=['batsman']
).transform_filter(
    "datum.total_runs > 4000"
).mark_bar().encode(
    alt.X('batsman:Q', sort=alt.EncodingSortField(field='total_runs', op='count', order='descending')),
    alt.Y('total_runs:Q'),
    tooltip=['batsman:Q', 'total_runs:Q']
).properties(height=600, width=3000).interactive()

推荐阅读