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

带共享日期色条的散点图绘制问题:子图色条独立异常

问题解决:共享全局日期色条的多子图散点图

需求与问题

需求:

  • 基于数据集的evlo(经度)、evla(纬度)绘制散点图,散点大小由LF值决定
  • 将fold列前8位转换为YYYY-MM-DD格式的datetime日期列,按15天间隔拆分数据并绘制子图
  • 所有子图共享同一个全局日期色条

问题:当前代码中每个子图的颜色映射独立,每个子图都呈现完整的蓝红色调,无法体现不同子图间的日期颜色对应关系。

错误原因

  1. 未定义全局统一的颜色归一化范围(norm),每个子图默认使用自身数据的日期范围做颜色映射,导致颜色标尺不统一
  2. 原代码中norm变量未初始化,直接调用会引发报错

修正后的代码

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import pandas as pd
import matplotlib.cm as cm
import matplotlib.colors as colors

# 1. 数据预处理:转换fold列为日期(假设fold列前8位是YYYYMMDD格式)
df['dates'] = pd.to_datetime(df['fold'].str[:8], format='%Y%m%d')

# 2. 过滤LF>1的数据
df_lf_more_than_1 = df[df['LF'] > 1]

# 3. 获取全局日期范围并转换为数值,创建统一的归一化规则
global_dates_num = mdates.date2num(df_lf_more_than_1['dates'])
norm = colors.Normalize(vmin=global_dates_num.min(), vmax=global_dates_num.max())

# 4. 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10), sharex=True, sharey=True)
axes = axes.flatten()

min_date = df_lf_more_than_1['dates'].min()
for i, ax in enumerate(axes):
    # 计算当前子图的时间区间
    start_date = min_date + pd.DateOffset(days=i * 15)
    end_date = start_date + pd.DateOffset(days=14)
    
    # 过滤当前区间的数据
    df_interval = df_lf_more_than_1[(df_lf_more_than_1['dates'] >= start_date)
                                    & (df_lf_more_than_1['dates'] <= end_date)]
    
    # 绘制散点图:使用全局统一的norm
    scatter = ax.scatter(df_interval['evlo'], df_interval['evla'], 
                         s=df_interval['LF']*5,
                         c=mdates.date2num(df_interval['dates']), 
                         cmap='jet',
                         norm=norm)  # 关键:绑定全局归一化规则
    
    # 设置子图标题与格式
    ax.set_title(f'区间: {start_date.strftime("%Y-%m-%d")} - {end_date.strftime("%Y-%m-%d")}')
    ax.xaxis.set_major_formatter(plt.FormatStrFormatter('%.2f'))

# 5. 添加全局共享色条
cax = fig.add_axes([0.15, 0.05, 0.7, 0.03])
cbar = fig.colorbar(scatter, cax=cax, orientation='horizontal')
# 将色条刻度转换为日期格式
cbar.ax.set_xticklabels(pd.to_datetime(cbar.get_ticks(), unit='D').strftime('%Y-%m-%d'))

plt.subplots_adjust(bottom=0.09)
plt.show()

关键修改点

  • 提前计算全局所有数据的日期数值范围,创建统一的Normalize对象,确保所有子图使用相同的颜色映射标尺
  • 每个scatter绘图时显式指定norm=norm,绑定全局颜色规则
  • 修复色条生成逻辑,直接使用散点对象生成色条,并将刻度转换为易读的日期格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:26:18