python - 如何使用 Altair 显示百分比直方图而不是计数

标签 python pandas data-visualization altair

如何使用 Altair 和 Pandas 获取总数百分比直方图而不是计数直方图?

我现在有这个:

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()',
)

最佳答案

您可以使用 Join Aggregate transform 来做到这一点其次是 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='%'))
)

enter image description here


编辑:这是我最初的答案,它要复杂得多:

这并不完全简单,因为它需要手动指定编码当前隐含的 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='%'))
)

enter image description here

我希望我们将来能够简化转换 API。

关于python - 如何使用 Altair 显示百分比直方图而不是计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56358977/

相关文章:

python - 回溯显示直到装饰器

python - 如何在一个 pandas 数据框列中搜索字符串作为另一个数据框列中的子字符串

matlab - 在 MATLAB 中将绘图数据与颜色和大小源链接

python - 如何在 python 中创建堆积线图?

javascript - 具有一致比例的圆形包装矩阵

python - 如何在 python 中使用 plotly 删除条形图中的间隙

python - 如何在Python中调用字典中的函数

python - 来自python的gcc编译错误

python - 服务器无法恢复事务。描述 :9800000002. (3971) (SQLEndTran)')

python - pd.read_csv 无法加载 csv 文件的第一列,并且在 Excel 中打开和保存时文件大小发生变化