如何使用Matplotlib复刻含多分组变量的目标统计图?
使用Matplotlib复刻目标统计图的解决方案
以下是基于你提供的数据,用Python Matplotlib实现堆叠柱状图(适配多系列年份统计图的常见样式)的完整代码,你可以根据目标图的细节调整样式:
步骤1:导入依赖并准备数据
先将你提供的R格式数据转换为Python可处理的结构,用pandas管理数据更便捷:
import matplotlib.pyplot as plt import pandas as pd # 你的原始数据 data = { 'year': (1988,1989,1990,1991,1992,1993,1994,1995,1996,1997, 1998,1999,2000,2001,2002,2003,2004,2005,2006,2007, 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017, 2018,2019,2020,2021,2022), 'LS4': (0,5,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0), 'LS5': (35,45,37,29,23,32,46,35,47,40, 52,55,46,38,0,6,47,41,45,43, 42,49,29,25,0,0,0,0,0,0, 0,0,0,0,0), 'LS7': (0,0,0,0,0,0,0,0,0,0, 0,3,20,24,43,33,42,27,25,26, 26,38,23,23,28,34,50,56,49,52, 51,57,54,48,49), 'LS8': (0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,33,60,61,58,53, 58,60,55,53,49), 'LS9': (0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,6,52), 'obs': (35,50,37,29,23,32,46,35,47,40, 52,58,66,62,43,39,89,68,70,69, 68,87,52,48,28,67,110,117,107,105, 109,117,109,107,150) } # 转换为DataFrame df = pd.DataFrame(data) years = df['year'] # 提取需要堆叠的系列 series = ['LS4', 'LS5', 'LS7', 'LS8', 'LS9']
步骤2:绘制堆叠柱状图+总和折线图
如果你的目标图是用堆叠柱状图展示各LS系列,同时用折线展示总观测数obs,可以用以下代码:
plt.figure(figsize=(12, 6)) # 初始化底部位置,用于堆叠 bottom = [0]*len(years) # 为每个系列绘制柱状图,设置不同颜色 colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'] for idx, col in enumerate(series): plt.bar(years, df[col], bottom=bottom, label=col, color=colors[idx]) # 更新底部位置 bottom = [b + df[col].iloc[i] for i, b in enumerate(bottom)] # 绘制obs总和折线图 plt.plot(years, df['obs'], marker='o', color='black', linewidth=2, label='总观测数(obs)') # 设置图表样式 plt.xlabel('年份', fontsize=12) plt.ylabel('数量', fontsize=12) plt.title('各LS系列年度数量分布', fontsize=14, pad=15) plt.legend(loc='upper left', bbox_to_anchor=(1, 1)) # 把图例放在图表外侧 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.xticks(rotation=45) # 旋转年份标签避免重叠 plt.tight_layout() plt.show()
样式调整说明
如果你需要匹配目标图的细节,可以修改以下部分:
- 颜色:替换
colors列表中的十六进制颜色码,和目标图一致 - 图例位置:调整
loc和bbox_to_anchor参数,或者放在图表内部 - 坐标轴范围:用
plt.ylim()设置y轴的上下限 - 柱状图宽度:在
plt.bar()中添加width参数(比如width=0.8) - 折线样式:修改
marker(比如换成s方形)、linestyle(比如'--'虚线)等
内容的提问来源于stack exchange,提问作者Toboggan
相关产品推荐
相关产品推荐

