在 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
我使用 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