Altair - 对合并数据和垂直注释线使用相同的轴

Altair - Use the same axis for binned data and vertical annotation lines

我有一个数据源,我正在尝试对其进行分类并从中构建直方图。 (请注意,下面的数据只是作为 post 处理的 bin 数据的示例)。

我的目标是绘制垂直线来注释轴的不同部分。

我比较接近其他 Whosebug 的答案,但问题是垂直线的轴与合并数据的轴是分开的。我的猜测是,这是因为垂直线的 x values 是定量的,而分箱数据是分类的。

有没有办法让竖线与底部的x-axis对齐?

data_bar = pd.DataFrame({
'bin': [0.78,0.82,0.88,0.92,0.98,1.02,1.08,1.12,1.18,1.23,1.27,1.32,1.38],
'freq': [0,3,18,95,279,416,660,411,263,200,53,22,0]
})
data_bar['bin'] = data_bar['bin'].astype('category')

data_lines = pd.DataFrame({
    'value': [0.8, 0.88, 1.001, 1.38],
    'title': ['no_match', 'match', 'no_match', 'match']     
})

bar = alt.Chart(data_bar).mark_bar().encode(x='bin', y='freq')
  
vertlines = alt.Chart(data_lines).mark_rule(
    color='black',
    strokeWidth=2
).encode(x='value')

text = alt.Chart(data_lines).mark_text(
    align='left', dx=5, dy=-5
).encode(
    x='value', text='title')


alt.layer(bar + vertlines + text).properties(width=500)

作为参考,here 是 vega 编辑器中的图表。

您需要在定量轴上绘制分箱数据,您可以通过设置 bin='binned' 并添加 x2 编码来指定每个分箱的上限。以下是对数据框和条形图所需的修改;其余的可以保持不变:

data_bar = pd.DataFrame({
'bin': [0.78,0.82,0.88,0.92,0.98,1.02,1.08,1.12,1.18,1.23,1.27,1.32,1.38],
'freq': [0,3,18,95,279,416,660,411,263,200,53,22,0]
})
data_bar['bin_max'] = data_bar['bin'].shift(-1).fillna(data_bar['bin'].max() + 0.05)

# Note: don't convert data['bin'] to category

bar = alt.Chart(data_bar).mark_bar().encode(
    x=alt.X('bin', bin='binned'),
    x2='bin_max',
    y='freq')

这是生成的图表: