如何基于含日期列的DataFrame绘制累计折线图及月分组柱状图
解决方案
步骤1:数据预处理
先完成日期格式校准、用户去重,再生成每日新增和累计用户的统计数据:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 加载你的数据(替换为实际数据源) df = pd.read_csv('your_data.csv') # 转换日期列为datetime类型 df['date_joined'] = pd.to_datetime(df['date_joined']) # 去重:每个用户仅保留首次加入记录 unique_users = df[['user_name', 'date_joined']].drop_duplicates(subset='user_name', keep='first') # 统计每日新增用户,补全无新增的日期(填充0) daily_new = unique_users.groupby('date_joined').size().reset_index(name='new_users') daily_new = daily_new.set_index('date_joined').resample('D').sum().fillna(0).reset_index() # 计算累计用户数 daily_new['cumulative_users'] = daily_new['new_users'].cumsum() # 新增月份分组列,用于柱状图按月份着色 daily_new['month'] = daily_new['date_joined'].dt.to_period('M').astype(str)
步骤2:绘制叠加双轴图
用左轴展示每日新增用户的柱状图,右轴展示累计用户的折线图:
plt.figure(figsize=(14, 7)) # 左轴:每日新增用户柱状图,按月份区分颜色 ax1 = sns.barplot(data=daily_new, x='date_joined', y='new_users', hue='month', palette='tab10', alpha=0.7) ax1.set_xlabel('日期') ax1.set_ylabel('每日新增用户数') ax1.tick_params(axis='x', rotation=45) # 右轴:累计用户折线图 ax2 = ax1.twinx() ax2.plot(daily_new['date_joined'], daily_new['cumulative_users'], color='#ff3333', linewidth=2, label='累计用户数') ax2.set_ylabel('累计用户数') ax2.legend(loc='upper left') # 调整布局避免标签重叠 plt.tight_layout() plt.title('论坛用户新增与累计趋势') plt.show()
优化提示
- 若数据跨度大(如数年),x轴每日标签会拥挤,可改为按月显示刻度:
ax1.set_xticks(daily_new.groupby('month')['date_joined'].first()) ax1.set_xticklabels(daily_new['month'].unique(), rotation=45) - 不需要按月份着色时,删除
hue='month'参数,改用单一颜色绘制柱状图即可。
内容的提问来源于stack exchange,提问作者Connor95
相关产品推荐
相关产品推荐

