Python中如何将按年份分列的宽表转换为长表用于matplotlib绘图
宽表转长表+散点图绘制实现方案
用pandas内置的长宽表转换方法即可,1万条数据的转换是毫秒级,不需要手动处理任何数据,全程代码自动化完成。
具体操作步骤
- 导入依赖库
核心用pandas做数据处理,matplotlib做可视化,先导入两个库:import pandas as pd import matplotlib.pyplot as plt - 读取原始宽表数据
根据你的文件格式用对应方法读取即可,以csv格式为例:
读取后可以用# 替换成你自己的文件路径 df_wide = pd.read_csv("gdp_growth_data.csv")print(df_wide.columns)确认列结构:第一列为国家名称,后续列均为1950-2021的年份列即可。 - 一行代码完成宽表转长表
用pandas的melt方法实现长宽表转换,这是最高效的向量化实现,比手写循环快上百倍:
转换完成后可以用df_long = df_wide.melt( id_vars="国家名称", # 保留不做转换的标识列 var_name="年份", # 转换后原列名存储的字段名 value_name="GDP增速" # 转换后原单元格数值存储的字段名 ) # 若年份列读入后是字符串格式,转成整数避免绘图时X轴排序错乱 df_long["年份"] = df_long["年份"].astype(int)print(df_long.head())抽查结果,每行对应一个国家-年份的GDP增速数据,完全符合你需要的长表结构。 - 绘制要求的散点图
按国家分组遍历绘图,每个国家作为独立数据系列:plt.figure(figsize=(12, 6), dpi=100) # 按国家分组生成独立散点系列 for country_name, data in df_long.groupby("国家名称"): plt.scatter( x=data["年份"], y=data["GDP增速"], label=country_name, alpha=0.6 # 加透明度缓解点重叠遮挡问题 ) # 图表标注设置 plt.xlabel("年份") plt.ylabel("GDP增速(%)") plt.title("1950-2021年各国GDP增速变化") # 图例放在绘图区外侧,避免遮挡数据 plt.legend(bbox_to_anchor=(1.02, 1), loc="upper left", borderaxespad=0) plt.tight_layout() # 自动调整布局避免标签被截断 plt.show()
小提示:如果涉及的国家数量过多,图例过长影响观感,可以按需筛选重点国家绘图,或者关闭图例展示。
内容的提问来源于stack exchange,提问作者James William
相关产品推荐
相关产品推荐

