You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. 样式字典:通过站点名绑定固定样式,彻底解决同一数据集在不同子图中配色不一致的问题
  2. 样式传递:将样式字典解包给plot()函数,替代子图默认的颜色循环,避免不同数据集配色重复
  3. 图例处理:收集每个数据集的唯一绘图句柄,通过fig.legend()创建全局图例,位置设置在子图顶部中央,不遮挡绘图内容
  4. 默认样式:针对未定义的站点,设置灰色方块的默认样式,保证兼容性

内容的提问来源于stack exchange,提问作者mark22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:21:24