【问题标题】:How to plot a pre-binned histogram with median line in Altair?如何在 Altair 中绘制带有中线的预分箱直方图?
【发布时间】:2019-11-09 18:55:23
【问题描述】:

这可能更像是一个数据处理问题,而不是 Altair 特有的问题。但是我有一些调查数据,其中受访者选择了一个年龄范围而不是他们的实际年龄,我正在尝试制作一个带有中线的直方图。带有平均线的 Altair 示例似乎都可以即时进行分箱,我不知道如何解决这个问题。

由于 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

该代码生成此图表:

【问题讨论】:

    标签: python data-visualization altair


    【解决方案1】:

    如果要计算 x 值的平均值,则需要指定定量值:计算字符串的平均值,即使这些字符串恰好包含数字,也没有明确定义。对于您的数据,您可以使用Calculate Transform 执行以下操作:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2021-10-29
      • 1970-01-01
      • 2021-09-29
      • 2023-01-18
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多