使用Seaborn绘制条形图:按年份展示Top10页面访问量
按年份展示Top10页面访问量的Seaborn条形图实现方案
我来帮你搞定这个按年份展示Top10页面访问量的条形图需求!咱们分三步来实现,每一步都有清晰的代码和解释:
1. 先聚合每年每个URL的总访问量
你的原始数据是每日的单URL访问记录,所以首先得把同一个URL在同一年的访问量加总,这样才能统计每个页面的年度总访问量:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设你的DataFrame名为df,包含列:Date, URL, Visits, Year # 按年份和URL分组,计算年度总访问量 yearly_url_visits = df.groupby(['Year', 'URL'])['Visits'].sum().reset_index()
2. 筛选每个年份的Top10页面
接下来,我们要给每个年份单独提取访问量排名前10的页面,这里有两种简洁的实现方式:
方式一:用groupby + apply直接取Top10
# 对每个年份分组,提取访问量最高的10条记录 top10_per_year = yearly_url_visits.groupby('Year').apply( lambda x: x.nlargest(10, 'Visits') ).reset_index(drop=True)
方式二:用排名筛选(适合需要保留排名信息的场景)
# 给每个年份内的URL按访问量降序排名 yearly_url_visits['Rank'] = yearly_url_visits.groupby('Year')['Visits'].rank(ascending=False, method='first') # 筛选排名前10的记录 top10_per_year = yearly_url_visits[yearly_url_visits['Rank'] <= 10].drop('Rank', axis=1)
3. 用Seaborn绘制分年份的条形图
现在我们用Seaborn的catplot来生成分面条形图,每个年份对应一个子图,这样能清晰对比不同年份的Top10页面:
# 设置Seaborn风格 sns.set_style("whitegrid") # 绘制分面条形图 g = sns.catplot( data=top10_per_year, x='Visits', y='URL', col='Year', kind='bar', palette='viridis', sharex=False, # 关闭x轴共享,避免不同年份访问量差异大导致显示失真 height=5, # 每个子图的高度 aspect=0.8, # 子图的宽高比 col_wrap=2 # 每行显示2个年份的子图(如果年份多的话可以调整这个数值) ) # 优化图表显示细节 g.set_titles("Top 10 Pages in {col_name}") # 设置每个子图的标题 g.set_axis_labels("Total Annual Visits", "Page URL") # 设置坐标轴标签 # 调整y轴URL标签的显示,避免重叠 for ax in g.axes.flat: ax.set_yticklabels(ax.get_yticklabels(), rotation=45, ha='right', fontsize=8) plt.tight_layout() plt.show()
可选:把所有年份放在同一图中对比
如果你想在同一个图里展示所有年份的Top10页面(适合年份较少的情况),可以用barplot加hue参数:
plt.figure(figsize=(12, 8)) sns.barplot( data=top10_per_year, x='Visits', y='URL', hue='Year', palette='viridis' ) plt.title("Top 10 Pages by Year") plt.xlabel("Total Visits") plt.ylabel("Page URL") plt.yticks(rotation=45, ha='right') plt.legend(title="Year") plt.tight_layout() plt.show()
这样就能完美实现你要的按年份分别展示Top10页面访问量的需求啦!
内容的提问来源于stack exchange,提问作者paulnsn
相关产品推荐
相关产品推荐

