如何用Python正确绘制每日评论量随时间变化的统计图?
问题分析与解决方案
原代码的核心问题
- 分组逻辑错误:直接按
created的具体时间点分组,而非按日期聚合,导致每个条形对应单条评论的num_comments值,而非每日总和,视觉上会出现大量细碎条形,所谓“骤降”实际是数据未正确聚合的假象。 - 数据格式不匹配:
groupby后得到的是Series,seaborn.barplot处理时会将每个时间索引当作独立类别,导致日期显示混乱。 - 日期刻度无效:由于x轴是具体时间点而非日期,
DayLocator无法正确定位每日刻度,导致日期显示异常。
正确实现步骤
1. 数据预处理与按日聚合
先确保created为datetime类型,再按日期聚合每日的num_comments总和(若你需要的是每日评论条数而非帖子评论数总和,将sum()替换为count()即可):
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import matplotlib.dates as mdates # 确保created列是datetime类型(若未转换) gme_interaction['created'] = pd.to_datetime(gme_interaction['created']) # 按日期聚合,计算每日num_comments总和 # 方法1:用dt.floor('D')保留datetime格式,方便后续日期处理 gme_comments_per_day = gme_interaction.groupby(gme_interaction['created'].dt.floor('D'))['num_comments'].sum().reset_index() # 方法2:补全缺失日期(若某天无数据,自动填充0,避免图表断档) # gme_comments_per_day = gme_interaction.set_index('created')['num_comments'].resample('D').sum().reset_index()
2. 绘制每日评论量变化图
plt.figure(figsize=(20, 12)) sns.barplot(x='created', y='num_comments', data=gme_comments_per_day) # 设置图表标题与标签 plt.title('WSB论坛GME相关内容每日评论总量变化') plt.xlabel('日期') plt.ylabel('总评论数') # 配置x轴日期显示 ax = plt.gca() # 设置主刻度为每天 ax.xaxis.set_major_locator(mdates.DayLocator()) # 设置日期格式为「月-日」(如01-01),可根据需求调整 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) # 旋转标签避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.savefig('Evolution of Interaction in WSB during GME.pdf') plt.show()
关键说明
- 若需求是统计每日发布的评论条数(即有多少条评论),修改聚合逻辑:
gme_comments_per_day = gme_interaction.groupby(gme_interaction['created'].dt.floor('D'))['comment'].count().reset_index() gme_comments_per_day.rename(columns={'comment': 'daily_comment_count'}, inplace=True) # 绘图时y参数改为'daily_comment_count' - 使用
resample('D')可自动补全缺失日期并填充0,避免因某天无数据导致图表出现“断档”式的骤降假象。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

