如何在Altair中绘制带有中线的预组合直方图?

这可能是Altair特定的数据处理问题。但是我有一些调查数据,在这些数据中,受访者选择了年龄范围而不是他们的实际年龄,并且我正在尝试使用中线绘制直方图。带有中性线的Altair示例似乎都在进行分类,我不确定如何解决。

由于x轴是分类的(我认为),所以我不能只在两者之间添加一条线。也许我需要将组转换为数字形式?

这是我到目前为止所拥有的

sample = ['35-39','25-29','30-34','22-24','50-54','40-44','35-39','25-29']
data = pd.DataFrame({'age': sample})
data

bars = alt.Chart(data).mark_bar().encode(
    x=alt.X('age'),y='count():Q'
)

mean = alt.Chart(data).mark_rule().encode(
    x = 'mean(age)',size=alt.value(5)
)

bars+mean

该代码将生成以下图表:

如何在Altair中绘制带有中线的预组合直方图?

wu540642448 回答:如何在Altair中绘制带有中线的预组合直方图?

如果要计算x值的平均值,则需要指定定量值:即使这些字符串碰巧包含数字,也不能很好地定义计算字符串的平均值。对于您的数据,您可以使用Calculate Transform来执行以下操作:

import altair as alt
import pandas as pd
sample = ['35-39','25-29','30-34','22-24','50-54','40-44','35-39','25-29']
data = pd.DataFrame({'age': sample})

base = alt.Chart(data).transform_calculate(
    age_min='parseInt(split(datum.age,"-")[0])',age_max='parseInt(split(datum.age,"-")[1]) + 1',age_mid='(datum.age_min + datum.age_max) / 2',)

bars = base.mark_bar().encode(
    x=alt.X('age_min:Q',bin='binned'),x2='age_max:Q',y='count():Q'
)

mean = base.mark_rule(size=5).encode(
    x = 'mean(age_mid):Q',)

bars+mean

enter image description here

请注意,这个平均值只是一个近似值:合并数据中没有足够的信息来计算实际平均年龄,但是每个bin的中点平均值是对真实值的最佳估计。

本文链接:https://www.f2er.com/3131655.html

大家都在问