如何转换DataFrame并用Seaborn/Matplotlib绘制特朗普当选前后多组折线图?
宽格式DataFrame转长格式并绘制多折线图解决方案
一、数据格式转换(核心步骤)
你的核心问题是将宽格式数据转为Seaborn/Matplotlib适配的长格式(tidy data),用Pandas的melt()方法就能快速实现。假设你的原始DataFrame结构如下:
| product_group_code | before_Trump_value | after_Trump_value |
|---|---|---|
| A | 100 | 120 |
| B | 80 | 95 |
| ... | ... | ... |
执行以下代码完成转换:
import pandas as pd # 替换为你的实际DataFrame名称 df_long = df.melt( id_vars="product_group_code", # 保留分组标识列 var_name="time_period", # 生成的时间阶段列名 value_name="value" # 生成的数值列名 ) # 可选:简化时间阶段的名称(去掉_value后缀) df_long["time_period"] = df_long["time_period"].str.replace("_value", "")
转换后的长格式DataFrame结构如下:
| product_group_code | time_period | value |
|---|---|---|
| A | before_Trump | 100 |
| A | after_Trump | 120 |
| B | before_Trump | 80 |
| B | after_Trump | 95 |
| ... | ... | ... |
二、绘制多折线图
方法1:用Seaborn快速绘制
Seaborn的lineplot可以直接按product_group_code分组绘制折线,代码简洁:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格 sns.set_style("whitegrid") # 创建画布 plt.figure(figsize=(10, 6)) # 绘制108条折线,按产品组分组 sns.lineplot( data=df_long, x="time_period", y="value", hue="product_group_code", legend=False, # 108条线的图例无意义,直接关闭 alpha=0.5 # 增加透明度,缓解线条重叠问题 ) # 设置轴标签和标题 plt.xlabel("时间阶段") plt.ylabel("数值") plt.title("各产品组特朗普当选前后数值变化") plt.show()
方法2:用Matplotlib循环绘制(更灵活)
如果需要对单条线做个性化设置,可通过循环实现:
import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) # 遍历每个产品组 for group in df["product_group_code"].unique(): group_data = df_long[df_long["product_group_code"] == group] plt.plot(group_data["time_period"], group_data["value"], alpha=0.5) plt.xlabel("时间阶段") plt.ylabel("数值") plt.title("各产品组特朗普当选前后数值变化") plt.show()
注意事项
- 如果原始DataFrame的列名不是
before_Trump_value/after_Trump_value,请对应调整melt()的参数和后续字符串替换逻辑。 - 108条线不可避免会重叠,调整
alpha(透明度)是最有效的缓解方式。 - 若需要重点展示特定产品组,可单独提取该组数据,用不同颜色/线宽重新绘制在顶层。
内容的提问来源于stack exchange,提问作者Jaevapple
相关产品推荐
相关产品推荐

