Как построить готовую гистограмму со средней линией в Альтаире? - PullRequest
1 голос
/ 09 ноября 2019

Вероятно, это скорее проблема обработки данных, чем специфичная для 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

Этот код создает эту диаграмму:

histogram

1 Ответ

1 голос
/ 10 ноября 2019

Если вы хотите вычислить среднее значение значений 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

enter image description here

Обратите внимание, что это означаетЭто всего лишь приблизительное значение: в ваших двоичных данных недостаточно информации для вычисления фактического среднего возраста, но среднее значение средних точек каждого бина является наилучшей оценкой истинного значения.

...