如何使用Pandas在同图绘制多类型推文生命周期分布
多类型推文生命周期同图绘制方案
你的数据中type列为多标签0/1标记,单条推文可同时归属多个类型,不需要做额外的表结构转换,沿用你原有全量分布的分箱逻辑,逐类统计后在同一坐标系绘图即可。
- 核心要求:所有类型必须使用完全一致的分箱边界,保证x轴区间对齐,避免分布对比失真
- 统计规则:跨类型归属的推文会在对应类型的计数中分别统计,符合多标签数据的分布统计逻辑,无需额外去重
第一步:固定统一分箱规则
和你原有代码的分箱逻辑保持一致,补充分箱上界避免最大值被截断,同时提前给所有数据打好分箱标签:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 计算分箱边界,3小时为步长 max_lifetime = df['lifetime_hours'].max().astype(int) bins = range(0, max_lifetime + 3, 3) # 给全量数据打统一分箱标签 df['lifetime_bin'] = pd.cut(df['lifetime_hours'], bins, include_lowest=True)
第二步:逐类型统计分箱内推文数量
遍历所有type列,筛选当前类型下的所有推文,统计每个生命周期分箱内的样本量,合并为统计宽表:
type_list = ['type1', 'type2', 'type3', 'type4'] bin_count = pd.DataFrame() for t in type_list: # 筛选属于当前类型的样本,按分箱排序计数 t_count = df[df[t] == 1]['lifetime_bin'].value_counts().sort_index() bin_count[t] = t_count # 空值填0,代表对应分箱内无该类型推文 bin_count = bin_count.fillna(0).astype(int)
第三步:绘制同框分组柱状图
直接基于统计表绘制分组柱状图,调整布局避免标签重叠:
plt.figure(figsize=(20, 6)) bin_count.plot(kind='bar', width=0.85, ax=plt.gca()) plt.xlabel('Tweets Lifetime(hours)') plt.ylabel('Number of Tweets Active') plt.title('Distribution of Tweets Lifetime by Type') plt.legend(title='Tweet Type') plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
可选优化:密度曲线对比
如果觉得分组柱状图视觉上太拥挤,也可以叠加核密度估计曲线,更直观对比不同类型推文的生命周期集中区间:
plt.figure(figsize=(20,4)) for t in type_list: df[df[t] == 1]['lifetime_hours'].plot(kind='kde', label=t, linewidth=2) plt.xlabel('Tweets Lifetime(hours)') plt.ylabel('Density') plt.title('Lifetime Density Distribution by Tweet Type') plt.xlim(0, max_lifetime) plt.legend() plt.tight_layout() plt.show()
注意:如果需要绘制归一化的频率分布而非绝对计数,只需要在统计计数时除以对应类型的总推文量即可,分箱逻辑不需要调整。
内容的提问来源于stack exchange,提问作者mOna
相关产品推荐
相关产品推荐

