显示其他图表时,Altair 图表通过下拉列表清空

问题描述 投票:0回答:1

我想要两个不同的图表,在第一个图表中我可以选择图例中的艺术家,在第二个图表中我想要一个下拉列表,用于过滤年份。在我的数据库中,我有艺术家、销量和年份(出版专辑)。这些图表本身工作得很好,但如果我想用垂直连接来显示这两个图表,我就会遇到问题。第一个图表按预期工作,但第二个图表在选择年份时完全为空。

import pandas as pd

# Sample Data
top = pd.DataFrame({
    'Artist': ['Artist1', 'Artist2', 'Artist3', 'Artist1', 'Artist2', 'Artist3'],
    'Sales': [100, 200, 300, 150, 250, 350],
    'Year': ['2020', '2020', '2020', '2021', '2021', '2021'],
})

# Selection for the legend
select_artist_legend = alt.selection_point(fields=["Artist"], bind="legend")

# First plot (cumulative sales over years)
line = alt.Chart(top).transform_window(
    cumulative_sales='sum(Sales)',
    sort=[{'field': 'Year'}],
    groupby=['Artist']
).mark_line().encode(
    alt.X("Year:T"),
    alt.Y("cumulative_sales:Q"),
    alt.Color("Artist:N"),
    opacity=alt.condition(select_artist_legend, alt.value(1.0), alt.value(0.1))
).add_params(select_artist_legend)

# Dropdown selection for the year
year_dd = alt.binding_select(options=sorted(top.Year.unique()), name="Year")
year_select = alt.selection_point(fields=["Year"], bind=year_dd, name='year_select')

# Third plot (sales by artist for selected year)
bar = alt.Chart(top).mark_bar().encode(
    alt.X("Artist:N"),
    alt.Y("Sales:Q"),
    alt.Color("Artist:N")
).add_params(year_select).transform_filter(year_select)

# Combine the charts
combined_chart = line & bar
combined_chart

注意:我正在使用 VS Code 和 Python Notebooks

我尝试调试并尝试进一步分离两个图表,但似乎没有帮助。我还尝试了两次堆叠条形图,而不是堆叠线和条形图,但一切正常,因此堆叠本身似乎不是问题。

python visualization altair
1个回答
0
投票

当您执行

alt.X("Year:T")
时,您正在将年份列转换为日期字符串,这意味着它不再与字符串“2020”或“2021”匹配。您可以通过将该列作为标称值和时间值包含在同一图表中(或通过在在线编辑器中查看 Vega 规范)来查看这一点:

top = pd.DataFrame({
    'Artist': ['Artist1', 'Artist2', 'Artist3', 'Artist1', 'Artist2', 'Artist3'],
    'Sales': [100, 200, 300, 150, 250, 350],
    'Year': ['2020', '2020', '2020', '2021', '2021', '2021'],
})

alt.Chart(top).mark_circle().encode(
    x='Year:T',
    y='Year:N',
)

enter image description here

您还必须将要比较的字符串转换为过滤器转换中的日期字符串才能正常工作。您可以通过将变换更改为

.transform_filter("toDate('year_select.Year')")
来做到这一点。这很难弄清楚,所以如果您希望可以在 Vega-Lite 问题跟踪器上打开一个问题来讨论替代方案,但我不确定替代语法会是什么样子。

© www.soinside.com 2019 - 2024. All rights reserved.