多线时间序列数据制作方法咨询及甘蔗、椰子、水稻产量时间序列绘图异常求助
多线时间序列数据制作与绘图问题解决方案
一、如何制作多线时间序列数据
多线时间序列的核心是清晰的数据结构,我更推荐用「长格式」来存储数据(每个时间点+对应分类+数值),这样后续绘图会省心很多。我用Python的pandas举个实际例子:
- 先明确需要的结构:
你需要三列数据:年份(时间维度)、作物类型(分类维度,比如甘蔗/椰子/水稻)、产量(数值维度)。 - 代码示例(生成模拟数据,你可以替换成自己的真实数据):
如果你手里是宽格式数据(比如每列是一个作物的产量),也可以用import pandas as pd import numpy as np # 生成2010-2020年的年份列表 years = pd.date_range(start='2010', end='2020', freq='Y').year # 定义作物类型 crops = ['甘蔗', '椰子', '水稻'] data = [] # 为每个作物生成带噪声的产量数据 for crop in crops: base_yield = 100 + crops.index(crop)*20 # 不同作物基础产量不同 yields = np.random.normal(loc=base_yield, scale=10, size=len(years)) # 将年份、作物、产量打包加入列表 data.extend(list(zip(years, [crop]*len(years), yields))) # 转为DataFrame,得到标准长格式数据 df = pd.DataFrame(data, columns=['年份', '作物类型', '产量'])pd.melt()转成长格式:# 假设宽格式df_wide的结构:年份 | 甘蔗 | 椰子 | 水稻 df_long = pd.melt(df_wide, id_vars='年份', var_name='作物类型', value_name='产量')
二、解决作物产量时间序列图的绘制问题
从你提供的输出图来看,大概率是数据格式不对或者绘图时没有正确区分作物。我给你两种常用的绘图方案,都是Python生态里最常用的:
方案1:用Seaborn快速绘制(推荐,代码简洁易维护)
Seaborn对分类时间序列的支持很好,一行代码就能区分不同作物:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格,让图更好看 sns.set_style("whitegrid") # 创建画布 plt.figure(figsize=(10, 6)) # 绘制多线图:hue参数用来区分不同作物 sns.lineplot(data=df, x='年份', y='产量', hue='作物类型', marker='o', linewidth=2) # 添加标题和坐标轴标签 plt.title('2010-2020年主要作物产量变化趋势', fontsize=14) plt.xlabel('年份', fontsize=12) plt.ylabel('产量', fontsize=12) # 显示图例并设置标题 plt.legend(title='作物类型') # 展示图形 plt.show()
方案2:用Matplotlib手动绘制(灵活度更高)
如果你习惯用Matplotlib手动控制细节,可以这样做:
import matplotlib.pyplot as plt # 先把长格式数据转成宽格式(方便逐个绘制线条) df_wide = df.pivot(index='年份', columns='作物类型', values='产量') plt.figure(figsize=(10, 6)) # 遍历每个作物,绘制对应的时间序列 for crop in df_wide.columns: plt.plot(df_wide.index, df_wide[crop], marker='o', label=crop, linewidth=2) # 添加标注 plt.title('2010-2020年主要作物产量变化趋势', fontsize=14) plt.xlabel('年份', fontsize=12) plt.ylabel('产量', fontsize=12) # 显示图例 plt.legend(title='作物类型') # 添加网格 plt.grid(True, alpha=0.3) plt.show()
常见问题排查
- 如果图里线条混乱、没有区分开作物:检查你的数据是否每个作物都有完整的时间序列,有没有缺失值;确保
作物类型列是字符串分类类型,不是数值。 - 如果年份坐标轴显示异常:确认
年份列是整数或datetime类型,不是字符串(可以用df['年份'] = pd.to_datetime(df['年份'], format='%Y')转成时间格式)。 - 如果图例不显示:记得调用
plt.legend(),或者在Seaborn的lineplot里指定hue参数。
内容的提问来源于stack exchange,提问作者Emily Essa
相关产品推荐
相关产品推荐

