如何根据用户输入更改 Altair 中的 mark_rule?

How to make the mark_rule in Altair change based on user input?

我想让mark_rule(显着性水平)可以调整。我尝试使用用户输入代码来完成此操作,并将规则中的值从 0.05 更改为 'user input',但图表结果很奇怪。

有两件事我想寻求帮助:

  1. 通过用户输入进行 mark_rule 更改(最高优先级)
  2. 更改mark_rule下方的条形(因素)颜色(可选)

我已经尝试了很多代码,到目前为止,我只能使用鼠标悬停来移动 mark_rule 但这并不是我想要做的。

非常感谢任何帮助。

import pandas as pd
import altair as alt

Sheet2 = 'P-value'
df = pd.read_excel('Life Expectancy Data- Clean.xlsx', sheet_name=Sheet2)

highlight = alt.selection(type='single', on='mouseover',
                          fields=['Factor'], nearest=True, empty="none")

bar = alt.Chart(df).mark_bar(strokeWidth=5, stroke="steelblue", strokeOpacity=0.1).encode(
        x = alt.X('Factor:O', sort='y'),
        y = alt.Y('P-value:Q'),
        tooltip = [alt.Tooltip('Factor:O'),alt.Tooltip('P-value:Q',format='.4f')],
        color= alt.condition(
            highlight,
            alt.value("orange"),
            alt.value("steelblue"))
    ).add_selection(
        highlight
    )

rule = alt.Chart(pd.DataFrame({'y': [0.05]})).mark_rule(color='red').encode(y='y')

alt.layer(
    bar, rule
).properties(
    title='Factors that Contribute to Life Expectancy in Malaysia',
    width=500, height=300
)

Current graph

the example in the Altair docs 的基础上,您可以做这样的事情,它会为您提供一个滑块来控制规则的位置,并根据它们是高于还是低于滑块值,以不同的颜色突出显示这些条:

import altair as alt
import pandas as pd
import numpy as np


rand = np.random.RandomState(42)

df = pd.DataFrame({
    'xval': range(10),
    'yval': rand.randn(10).cumsum()
})

slider = alt.binding_range(min=0, max=5, step=0.5, name='cutoff:')
selector = alt.selection_single(name="SelectorName", bind=slider, init={'cutoff': 2.5})

rule = alt.Chart().mark_rule().transform_calculate(
    rule='SelectorName.cutoff'
).encode(
    # Take the mean to avoid creating multiple lines on top of eachother
    y='mean(rule):Q', 
)

bars = alt.Chart(df).mark_bar().encode(
    x='xval:O',
    y='yval',
    color=alt.condition(
        alt.datum.yval < selector.cutoff,
        alt.value('coral'), alt.value('steelblue')
    )
).add_selection(
    selector
)

bars + rule