【问题标题】:Altair double dropdown menuAltair 双下拉菜单
【发布时间】:2020-05-15 20:28:15
【问题描述】:

我想创建一个带有两个下拉菜单的绘图。线条的不透明度应取决于 both 下拉菜单中的选择。

理想情况下,第二个下拉菜单(下面的“dropdown_symbol”)的可能内容应取决于第一个下拉菜单中的选择(当在第一个下拉菜单中选择“category_2”时,仅显示“AMZM”和“IBM”在第二个下拉菜单)。

不幸的是,不透明度既不能正常工作,也不能限制可能的内容。这是我的示例代码:

import altair as alt
from vega_datasets import data

source = data.stocks()
source.symbol.value_counts()


source["category"] = "category_1"
source.loc[source["symbol"].isin(["AMZN", "IBM"]), "category"] = "category_2"


dropdown_category = alt.binding_select(options=list(source["category"].unique()), name=" ")
dropdown_symbol = alt.binding_select(options=list(source["symbol"].unique()), name=" ")

selection_category = alt.selection_single(fields=["category"], bind=dropdown_category)
selection_symbol = alt.selection_single(fields=["symbol"], bind=dropdown_symbol)

chart = alt.Chart(source).mark_line().encode(
    x='date',
    y='price',
    color='symbol',
    opacity=alt.condition(
        selection_category & selection_symbol,
        alt.value(1),
        alt.value(0.1)
)).add_selection(selection_symbol, selection_category)

chart

【问题讨论】:

    标签: python plot dropdown interactive altair


    【解决方案1】:

    我想创建一个带有两个下拉菜单的绘图。线条的不透明度应取决于两个下拉菜单中的选择。

    如果您希望不透明度取决于两个下拉菜单中的选择,您可以使用alt.condition 语句并使用布尔运算符传递两个选择对象;例如:

    opacity=alt.condition(
            selection1 & selection2,
            alt.value(1),
            alt.value(0.1))
    

    仅当点在两个选择范围内时才会选择第一个值。或者,

    opacity=alt.condition(
            selection1 | selection2,
            alt.value(1),
            alt.value(0.1))
    

    如果点在至少一个的选择范围内,将选择第一个值。

    请注意,以这种方式使用多个选择时,空选择的行为存在一个已知错误;请参阅https://github.com/altair-viz/altair/issues/1759 和其中的引用。

    理想情况下,第二个下拉菜单(下面的“dropdown_symbol”)的可能内容应取决于第一个下拉菜单中的选择(当在第一个下拉菜单中选择“category_2”时,仅显示“AMZM”和“IBM”在第二个下拉菜单)。

    在 Altair 中,下拉菜单的内容不可能根据另一个下拉菜单中的选择动态更改。

    要改变这一点,必须将功能添加到 Vega-Lite:您可以提交功能请求 here。

    【讨论】:

      【解决方案2】:

      我一直在努力做类似的工作,我想还有其他人和我一样,所以让我在这里发布我对您问题第一部分的解决方案。

      要跟进 jakevdp 的回答,提到 Vega-lite 中的错误:有一种解决方法描述了 here。但是,我找不到将其转换为正确的 Altair Python 代码的方法,因此我选择将条件编写为 Json/嵌入式 dicts 格式的 Vega 规范。这里的关键是包含test 字段。

      此外,您可能想要一种重置选择的方法。这可以通过在选项中包含None 来完成,如here 所述。

      下面的代码适用于 Altair 4.1.0。

      import altair as alt
      from vega_datasets import data
      
      source = data.stocks()
      source.symbol.value_counts()
      
      source["category"] = "category_1"
      source.loc[source["symbol"].isin(["AMZN", "IBM"]), "category"] = "category_2"
      
      cat_values = list(source["category"].unique())
      sym_values = list(source["symbol"].unique())
      
      cat_options = [None] + cat_values
      sym_options = [None] + sym_values
      
      cat_labels = ["All"] + cat_values
      sym_labels = ["All"] + sym_values
      
      dropdown_category = alt.binding_select(options=cat_options, labels=cat_labels, name=" ")
      dropdown_symbol = alt.binding_select(options=sym_options, labels=sym_labels, name=" ")
      
      selection_category = alt.selection_single(fields=["category"], bind=dropdown_category, name="cat")
      selection_symbol = alt.selection_single(fields=["symbol"], bind=dropdown_symbol, name="sym")
      
      op_condition = {"condition":
                      {"test":
                       {"and":
                        [{"selection": "cat"},
                         {"selection": "sym"}]},
                          "value": 1},
                      "value": 0.1}
      
      chart = alt.Chart(source).mark_line().encode(
          x='date',
          y='price',
          color='symbol',
          opacity=op_condition
      ).add_selection(selection_symbol, selection_category)
      
      chart
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 2012-01-12
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 2018-01-27
        • 2020-06-03
        相关资源
        最近更新 更多