Altair 中的聚合函数块绘图交互
Agregate functions block plot interactivity in Altair
考虑以下改编自的代码:Altair website
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
alt.Chart(source).mark_bar().encode(
x='a',
y='b:Q'
).interactive()
输出此图:
这是互动(我们可以放大)。但是,如果我 将 Y 编码字段 更改为以下内容(这是我需要的)- 通过添加聚合函数:
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
alt.Chart(source).mark_bar().encode(
x='a',
y='sum(b):Q'
).interactive()
剧情不再互动。是否可以在使用 聚合函数 时使其具有交互性,即:四处移动、放大、缩小?
谢谢:)
这是 Vega/Vega-Lite 中的已知限制;见 https://github.com/vega/vega-lite/issues/5308
作为解决方法,您可以将预先聚合的数据传递到图表:
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
data = source.groupby('a').sum().reset_index()
alt.Chart(data).mark_bar().encode(
x='a',
y=alt.Y('b', title='Sum of b')
).interactive()
考虑以下改编自的代码:Altair website
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
alt.Chart(source).mark_bar().encode(
x='a',
y='b:Q'
).interactive()
输出此图:
这是互动(我们可以放大)。但是,如果我 将 Y 编码字段 更改为以下内容(这是我需要的)- 通过添加聚合函数:
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
alt.Chart(source).mark_bar().encode(
x='a',
y='sum(b):Q'
).interactive()
剧情不再互动。是否可以在使用 聚合函数 时使其具有交互性,即:四处移动、放大、缩小?
谢谢:)
这是 Vega/Vega-Lite 中的已知限制;见 https://github.com/vega/vega-lite/issues/5308
作为解决方法,您可以将预先聚合的数据传递到图表:
import altair as alt
import pandas as pd
source = pd.DataFrame({
'a': ['A', 'B', 'B', 'B', 'E', 'F', 'G', 'H', 'I'],
'b': [28, 55, 43, 91, 81, 53, 19, 87, 52]
})
data = source.groupby('a').sum().reset_index()
alt.Chart(data).mark_bar().encode(
x='a',
y=alt.Y('b', title='Sum of b')
).interactive()