带共享日期色条的散点图绘制问题:子图色条独立异常
问题解决:共享全局日期色条的多子图散点图
需求与问题
需求:
- 基于数据集的
evlo(经度)、evla(纬度)绘制散点图,散点大小由LF值决定 - 将
fold列前8位转换为YYYY-MM-DD格式的datetime日期列,按15天间隔拆分数据并绘制子图 - 所有子图共享同一个全局日期色条
问题:当前代码中每个子图的颜色映射独立,每个子图都呈现完整的蓝红色调,无法体现不同子图间的日期颜色对应关系。
错误原因
- 未定义全局统一的颜色归一化范围(
norm),每个子图默认使用自身数据的日期范围做颜色映射,导致颜色标尺不统一 - 原代码中
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
相关产品推荐
相关产品推荐

