簡體   English   中英

如何 plot 在 Altair 中使用中線預分箱直方圖?

[英]How to plot a pre-binned histogram with median line in Altair?

這可能更像是一個數據處理問題,而不是 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

該代碼生成此圖表:

直方圖

如果要計算 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

在此處輸入圖像描述

請注意,這個平均值只是一個近似值:分箱數據中沒有足夠的信息來計算實際平均年齡,但每個分箱的中點的平均值是對真實值的最佳估計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM