Python: Altair:有条件地更改轴标签的外观(颜色,透明度)

3

目前,Vega不支持交互式轴标签,即无法通过单击轴标签创建选择 (参见问题1657)。因此Altair也不能支持。

因此,我正在尝试通过提供图例选择并更改轴标签的外观来找到解决方法。

我能够根据条件对标签进行着色(请参见下面的代码示例)。

import altair as alt
from vega_datasets import data
source = data.unemployment_across_industries.url

selection = alt.selection_multi(fields=['series'], bind='legend')

alt.Chart(source).mark_bar().encode(
alt.X('series:N', axis=alt.Axis(labelColor=alt.condition('datum.value == "Finance"', alt.value('red'), alt.value('black')))),
alt.Y('sum(count):Q'),
alt.Color('series:N', scale=alt.Scale(scheme='category20b')),
opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
).add_selection(
    selection
)

然而,当尝试使用选择而不是表达式时,我会遇到错误。

alt.X('series:N', axis=alt.Axis(labelColor=alt.condition(selection, alt.value('red'), alt.value('black')))),

有没有办法将标签外观与选择 (这里是绑定到图例) 相关联?

2个回答

4

没有找到一种动态更改轴标签的方法,但通过使用mark_text来显示轴标签,成功接近解决方案。

bars = alt.Chart(source).mark_bar().encode(
    alt.X('series:N', axis=alt.Axis(labels=False, title="")),
    alt.Y('sum(count):Q'),
    alt.Color('series:N', scale=alt.Scale(scheme='category20b')),
    opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
).add_selection(
    selection
)

labels = alt.Chart(source).mark_text(align='right', angle=270).encode(
    alt.X('series:N', axis=None),
    text='series:N',
    opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
).transform_aggregate(
    groupby=["series"]
)

(bars & labels).configure(
    concat=alt.CompositionConfig(spacing=0)
).configure_view(
    strokeWidth=0
)

展示了一个动画,选择标签不仅在条形图中反映出来,也反映在坐标轴标签中

(仍然希望学习更好的解决方案。)


现在有更好的方法吗?还是没有改进吗?是否有相关功能请求可以跟进? - nraw

0

从altair 5开始,您可以使用内联表达式,如下所示:

import altair as alt
from vega_datasets import data
source = data.unemployment_across_industries.url

selection = alt.selection_point(fields=['series'], bind='legend')
color_expr = alt.expr(f"datum.value == {selection.name}_series_legend ? 'red' : 'black'")
weight_expr = alt.expr(f"datum.value == {selection.name}_series_legend ? 'bolder' : 'normal'")

chart = alt.Chart(source).mark_bar().encode(
alt.X('series:N').axis(labelColor=color_expr, labelFontWeight=weight_expr),
alt.Y('sum(count):Q'),
alt.Color('series:N', scale=alt.Scale(scheme='category20b')),
opacity=alt.condition(selection, alt.value(1), alt.value(0.2))
).add_params(
    selection
)
chart

enter image description here

然而,这仅适用于单个选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接