Python使用Altair绘制柱状图如何仅展示平均薪资排名前10的公司
解决方案
你可以通过以下两种方式实现仅展示平均薪资前10的公司:
方案1:提前用Pandas预处理数据(更直观易维护)
先对原始数据做聚合排序取前10,再传入Altair绘图:
import pandas as pd # 按公司分组计算平均薪资,降序排序后取前10 top10_company_df = final1.groupby('company', as_index=False)['salary'].mean()\ .sort_values('salary', ascending=False)\ .head(10) # 基于处理后的数据绘图 alt.Chart(top10_company_df, title="Avg salary for IT Project Manager I in each company").mark_bar(size=20).encode( alt.X("company:N", sort="-y"), alt.Y("salary:Q", title="average(salary)"), color=alt.condition( alt.datum.company == 'Celerity', alt.value('orange'), alt.value('steelblue') ) ).properties(width=800)
方案2:使用Altair内置转换算子(无需修改原数据)
通过Altair自带的聚合、窗口、过滤算子直接在绘图逻辑中实现筛选:
alt.Chart(final1, title="Avg salary for IT Project Manager I in each company").mark_bar(size=20).encode( alt.X("company:N", sort="-y"), alt.Y("avg_salary:Q", title="average(salary)"), color=alt.condition( alt.datum.company == 'Celerity', alt.value('orange'), alt.value('steelblue') ) ).transform_aggregate( # 按公司分组计算平均薪资 avg_salary='average(salary)', groupby=['company'] ).transform_window( # 按平均薪资降序生成排名 rank='rank(avg_salary)', sort=[alt.SortField('avg_salary', order='descending')] ).transform_filter( # 筛选排名前10的公司 alt.datum.rank <= 10 ).properties(width=800)
注意事项
如果存在多公司平均薪资相同的并列情况,rank()函数会将并列项算为同一名次,最终展示的公司数量可能略多于10。如果需要严格限制为10条,可将窗口函数中的rank替换为row_number(),即使薪资相同也会按顺序生成唯一排名。
内容的提问来源于stack exchange,提问作者rishi
相关产品推荐
相关产品推荐

