You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含日期列的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:35:17