在 Altair 的条形图标签中组合字符串和聚合函数

Combining string and aggregate function within bar chart label in Altair

我使用 Altair 制作了两个带有交叉过滤的交互式直方图。我使用 mark_text() 在每个条形图上创建了带有过滤项总和的标签。下面是链接图表的图像:

我想了解如何连接标签中的字符串,使其看起来像:'error: 481.1'。这是相关的代码片段:

crossfilter = alt.selection(type='interval', encodings=['x'])

tick_up = alt.Chart().transform_filter(crossfilter).mark_tick(color='black').encode(
                                x = x, 
                                y = alt.Y(plus_error+':Q', aggregate='sum'))
text = tick_up.mark_text(
        align='left',
        baseline='middle',
        dx=12  
    ).encode(text='sum(error):Q')

当我尝试将 .encode(text='sum(error):Q') 更改为 .encode(text='"error": sum(error):Q') 之类的内容时,它抛出一个错误,有没有简单的方法可以做到这一点?我也尝试过使用 transform_calculate,但我需要一些适应 crossfilter 所选择内容的东西。

我也想学习如何创建多行标签,例如:

curr_error: 123.1 
previous_error: 110

您可以在 transform_calculate 中使用 + 来连接字符串和数字。我相信您还需要 transform_joinaggregate 才能在计算转换中访问您的总和。像这样:

import altair as alt
from vega_datasets import data

source = data.cars()

chart = alt.Chart(source).mark_text(align='left', dx=2).encode(
    x='sum(Horsepower)',
    y='Origin',
    text='label:N'
).transform_joinaggregate(
    sum_hp = 'sum(Horsepower)',
    groupby=['Origin']
).transform_calculate(
    label = "'error: ' + datum.sum_hp"
)

chart.mark_bar() + chart

这也适用于选择,但要确保 transform_filter 在其他转换之前,以便只有选定的数据点用于计算:

import altair as alt
from vega_datasets import data

source = data.cars()
brush = alt.selection_interval()

scatter = alt.Chart(source).mark_point().encode(
    x='Horsepower',
    y='Weight_in_lbs',
    color='Origin'
).add_selection(
    brush
)

bars = alt.Chart(source).mark_text(align='left', dx=2).encode(
    x='sum(Horsepower)',
    y='Origin',
    text='label:N'
).transform_filter(
    brush
).transform_joinaggregate(
    sum_hp = 'sum(Horsepower)',
    groupby=['Origin']
).transform_calculate(
    label = "'error: ' + datum.sum_hp"
)

scatter & bars.mark_bar() + bars