Как показать гистограмму процентов вместо подсчетов, используя Altair - PullRequest
2 голосов
/ 29 мая 2019

Как я могу получить гистограмму процентов от общего количества вместо гистограммы подсчета, используя Альтаира и Панд?

У меня есть это на данный момент:

Histogram of values

Что я получил, сделав это:

d = {'age': ['12', '32', '43', '54', '32', '32', '12']}
dfTest = pd.DataFrame(data=d)

alt.Chart(dfTest).mark_bar().encode(
    alt.X("age:Q", bin=True),
    y='count()',
)

1 Ответ

2 голосов
/ 29 мая 2019

Вы можете сделать это с помощью Объединенного преобразования с последующим Расчетным преобразованием :

import pandas as pd
import altair as alt

source = pd.DataFrame({'age': ['12', '32', '43', '54', '32', '32', '12']})

alt.Chart(source).transform_joinaggregate(
    total='count(*)'
).transform_calculate(
    pct='1 / datum.total'
).mark_bar().encode(
    alt.X('age:Q', bin=True),
    alt.Y('sum(pct):Q', axis=alt.Axis(format='%'))
)

enter image description here


Редактировать: это был мой первоначальный ответ, который намного сложнее:

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

import pandas as pd
import altair as alt

source = pd.DataFrame({'age': ['12', '32', '43', '54', '32', '32', '12']})

alt.Chart(source).transform_bin(
    ['age_min', 'age_max'],
    field='age',
).transform_aggregate(
    count='count()',
    groupby=['age_min', 'age_max']
).transform_joinaggregate(
    total='sum(count)'  
).transform_calculate(
    pct='datum.count / datum.total'  
).mark_bar().encode(
    alt.X("age_min:Q", bin='binned'),
    x2='age_max',
    y=alt.Y('pct:Q', axis=alt.Axis(format='%'))
)

enter image description here

Я надеюсь, что в будущем мы сможем оптимизировать API преобразования.

...