如何使用 Altair 显示百分比直方图而不是计数
How to show a histogram of percentages instead of counts using Altair
如何使用 Altair 和 Pandas 获得总数百分比直方图而不是计数直方图?
我现在有这个:
我这样做得到的:
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()',
)
您可以使用 Join Aggregate transform followed by a Calculate transform:
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='%'))
)
编辑:这是我最初的回答,但要复杂得多:
这并不完全简单,因为它需要手动指定您的编码当前隐含的 bin 和聚合转换,然后是计算转换以计算百分比。这是一个例子:
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='%'))
)
我希望我们将来能够简化转换 API。
如何使用 Altair 和 Pandas 获得总数百分比直方图而不是计数直方图?
我现在有这个:
我这样做得到的:
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()',
)
您可以使用 Join Aggregate transform followed by a Calculate transform:
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='%'))
)
编辑:这是我最初的回答,但要复杂得多:
这并不完全简单,因为它需要手动指定您的编码当前隐含的 bin 和聚合转换,然后是计算转换以计算百分比。这是一个例子:
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='%'))
)
我希望我们将来能够简化转换 API。