Python 如何在Altair中绘制带有中间线的预分块直方图?

Python 如何在Altair中绘制带有中间线的预分块直方图?,python,data-visualization,altair,Python,Data Visualization,Altair,这可能更像是一个数据处理问题,而不是牵牛星特有的问题。但我有一些调查数据,受访者选择了一个年龄范围,而不是他们的实际年龄,我试图用一条中间线绘制一个直方图。牵牛星的例子与平均线似乎都做了宾宁的飞行,我不知道如何解决这个问题 因为x轴是绝对的(我想),我不能在两者之间加一条线。也许我需要把这些组转换成数字 这是我到目前为止所拥有的 sample = ['35-39', '25-29', '30-34', '30-34', '25-29', '30-34', '22-24', '

这可能更像是一个数据处理问题,而不是牵牛星特有的问题。但我有一些调查数据,受访者选择了一个年龄范围,而不是他们的实际年龄,我试图用一条中间线绘制一个直方图。牵牛星的例子与平均线似乎都做了宾宁的飞行,我不知道如何解决这个问题

因为x轴是绝对的(我想),我不能在两者之间加一条线。也许我需要把这些组转换成数字

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

sample = ['35-39', '25-29', '30-34', '30-34', '25-29', '30-34', '22-24',
          '50-54', '30-34', '40-44', '22-24', '25-29', '22-24', '50-54',
          '22-24', '35-39', '25-29', '22-24', '22-24', '25-29', '25-29',
          '30-34', '22-24', '40-44', '30-34', '25-29', '30-34', '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
该代码生成以下图表:


如果要计算x值的平均值,需要指定定量值:计算字符串的平均值,即使这些字符串碰巧包含数字,也没有很好的定义。对于您的数据,您可以使用

import altair as alt
import pandas as pd
sample = ['35-39', '25-29', '30-34', '30-34', '25-29', '30-34', '22-24',
          '50-54', '30-34', '40-44', '22-24', '25-29', '22-24', '50-54',
          '22-24', '35-39', '25-29', '22-24', '22-24', '25-29', '25-29',
          '30-34', '22-24', '40-44', '30-34', '25-29', '30-34', '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

请注意,此平均值只是一个近似值:在您的装箱数据中没有足够的信息来计算实际平均年龄,但每个装箱中点的平均值是真实值的最佳估计值