You need to enable JavaScript to run this app. R中如何统计品牌出现次数并绘制按所有者分组的折线图
优惠活动
大模型
产品
解决方案
定价
更多

R中如何统计品牌出现次数并绘制按所有者分组的折线图

实现步骤及代码示例

1. 依赖库导入

使用pandas做数据处理,matplotlib做可视化即可实现需求:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter

2. 数据预处理

先将Period字段的字符串转成标准格式,同时生成要求的yearmon数字格式:

# 构造示例DataFrame
data = {
    'Brand': ['Adidas', 'Nike', 'Adidas', 'Nike', 'Puma', 'Joma', 'Adidas', 'Diadora'],
    'owner': ['andy', 'diana', 'rose', 'sara', 'laura', 'harry', 'jon', 'keith'],
    'Period': ['May 2018', 'June 2019', 'August 2019', 'July 2020', 'March 2020', 'April 2018', 'May 2018', 'June 2021']
}
df = pd.DataFrame(data)

# 转换Period为日期格式
df['Period_dt'] = pd.to_datetime(df['Period'], format='%B %Y')
# 生成yearmon数字格式(如2018年5月=2018 + 5/12 ≈ 2018.4167)
df['yearmon_num'] = df['Period_dt'].dt.year + df['Period_dt'].dt.month / 12

3. 聚合统计品牌出现次数

按owner、年月维度聚合统计品牌出现次数:

count_df = df.groupby(['owner', 'yearmon_num', 'Period_dt'], as_index=False)['Brand'].count()
count_df.rename(columns={'Brand': 'brand_count'}, inplace=True)

4. 绘制折线图

方案1:使用yearmon数字格式作为x轴

plt.figure(figsize=(10,6))
# 按owner分组循环绘制折线
for owner, group in count_df.groupby('owner'):
    plt.plot(group['yearmon_num'], group['brand_count'], marker='o', label=owner)

plt.xlabel('Year-Month (Numeric)')
plt.ylabel('Brand Occurrence Count')
plt.legend(title='Owner')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

方案2:优化x轴可读性(可选)

如果不需要严格使用数字x轴,可直接用日期格式做x轴,显示效果更直观:

plt.figure(figsize=(10,6))
for owner, group in count_df.groupby('owner'):
    plt.plot(group['Period_dt'], group['brand_count'], marker='o', label=owner)

plt.xlabel('Year-Month')
plt.ylabel('Brand Occurrence Count')
plt.legend(title='Owner')
# 格式化x轴日期显示为年-月格式
plt.gca().xaxis.set_major_formatter(DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Hash Slasher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 17:57:01