Matplotlib子图多数据集配色与统一图例设置求助
解决Matplotlib子图多数据集配色重复与全局图例问题
修改思路
- 为每个数据集(站点)预定义专属颜色、标记及线型,确保同一数据集在所有子图中样式统一
- 将样式参数传递给绘图函数,绕过子图默认的颜色循环逻辑,避免配色重复
- 收集唯一的绘图句柄,用于生成全局统一图例
完整修改代码
import os import pandas as pd import matplotlib.pyplot as plt # 定义各站点的专属样式(可根据实际站点扩展) station_styles = { "UH01": {"color": "#1f77b4", "marker": "o", "linestyle": "-", "label": "UH01"}, "UH02": {"color": "#ff7f0e", "marker": "^", "linestyle": "--", "label": "UH02"} } def cal_95CI(year, rain, style): # 按指定样式绘图,返回子图的line对象(用于图例) line1, = fig1.plot(year, rain, **style) line2, = fig2.plot(year, rain, **style) line3, = fig3.plot(year, rain, **style) line4, = fig4.plot(year, rain, **style) return line1 # 创建子图 fig, (fig1, fig2, fig3, fig4) = plt.subplots(4, figsize=(16,14)) handles = [] labels = [] directory = "./your_data_directory" # 替换为你的数据目录路径 for fin in os.listdir(directory): if fin.endswith(".txt"): GNSS = fin[0:4] ts_enu = pd.read_csv(fin, header=0, delim_whitespace=True) year = ts_enu.iloc[:,0] rain = ts_enu.iloc[:,1] # 获取当前站点样式,无匹配时用默认样式 style = station_styles.get(GNSS, {"color": "gray", "marker": "s", "linestyle": ":", "label": GNSS}) # 绘图并获取line对象 line = cal_95CI(year, rain, style) # 避免重复添加图例项 if style["label"] not in labels: handles.append(line) labels.append(style["label"]) # 添加全局统一图例 fig.legend(handles=handles, labels=labels, loc='upper center', bbox_to_anchor=(0.5, 1.02), ncol=2, fontsize=12) # 调整子图间距,避免图例遮挡 plt.tight_layout() fig.subplots_adjust(top=0.92) fig.savefig('_Decomposition.pdf') plt.show()
关键修改说明
- 样式字典:通过站点名绑定固定样式,彻底解决同一数据集在不同子图中配色不一致的问题
- 样式传递:将样式字典解包给
plot()函数,替代子图默认的颜色循环,避免不同数据集配色重复 - 图例处理:收集每个数据集的唯一绘图句柄,通过
fig.legend()创建全局图例,位置设置在子图顶部中央,不遮挡绘图内容 - 默认样式:针对未定义的站点,设置灰色方块的默认样式,保证兼容性
内容的提问来源于stack exchange,提问作者mark22
相关产品推荐
相关产品推荐

