如何为刻度不同的hist2d子图添加统一色条并规范x轴刻度
解决方案:统一色条与x轴刻度格式调整
1. 实现统一色条
由于两个子图的数值范围不同(上限6和14),要实现统一色条,需:
- 先计算两个数据集的全局最小值和最大值,作为共同的颜色映射范围(
vmin和vmax) - 绘制两个
hist2d时指定相同的vmin、vmax和cmap - 只添加一个色条,关联两个子图,放在整体布局的右侧
2. 修正x轴科学计数法问题
Matplotlib会自动选择刻度格式,当刻度值的小数位数或范围触发科学计数法时,可通过设置刻度格式器强制使用常规小数格式。
修改后的完整代码
import matplotlib.pyplot as plt from matplotlib.ticker import ScalarFormatter import numpy as np from datetime import timedelta # 原数据处理部分 t_arrival=ce['P_Time']; t_0=t_arrival[70]; t_a=t_0 + timedelta(hours=72); t_b=t_0 - timedelta(hours=72); x_bins = np.linspace(-130.05, -129.95, 20); y_bins = np.linspace(45.90, 46, 20); df_b = df_lo[(df_lo['A_t'].between(t_b,t_0))]; y_b=df_b['lat']; x_b=df_b['long']; df_a = df_lo[(df_lo['A_t'].between(t_0,t_a))]; y_a=df_a['lat']; x_a=df_a['long']; # 计算全局颜色范围 counts_b, _, _ = np.histogram2d(x_b, y_b, bins=[x_bins, y_bins]) counts_a, _, _ = np.histogram2d(x_a, y_a, bins=[x_bins, y_bins]) vmin = min(counts_b.min(), counts_a.min()) vmax = max(counts_b.max(), counts_a.max()) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5), sharey=True) # 绘制第一个子图,指定统一颜色范围 b=ax1.hist2d(x_b, y_b, bins =[x_bins, y_bins], cmap='Blues', vmin=vmin, vmax=vmax) ax1.set_xlim([-130.05, -129.95]) ax1.set_ylim([45.90, 46]) ax1.set_yticks([45.90, 45.925, 45.95, 45.975, 46]) ax1.set_xticks([-130.05, -130.025, -130, -129.975, -129.95]) ax1.set_ylabel('Latitude', fontsize=10) ax1.set_xlabel('Longitude', fontsize=10) # 绘制第二个子图,使用相同颜色范围 a=ax2.hist2d(x_a, y_a, bins =[x_bins, y_bins], cmap='Blues', vmin=vmin, vmax=vmax) ax2.set_xlim([-130.05, -129.95]) ax2.set_ylim([45.90, 46]) ax2.set_yticks([45.90, 45.925, 45.95, 45.975, 46]) ax2.set_xticks([-130.05, -130.025, -130, -129.975, -129.95]) ax2.set_xlabel('Longitude', fontsize=10) # 修正x轴刻度格式,禁用科学计数法 for ax in [ax1, ax2]: ax.xaxis.set_major_formatter(ScalarFormatter(useOffset=False)) ax.ticklabel_format(style='plain', axis='x') # 添加统一色条,关联两个子图 fig.colorbar(b[3], ax=[ax1, ax2], shrink=0.80, label='Observations/day', fontsize=10) plt.tight_layout() plt.show()
关键修改说明
- 全局颜色范围计算:通过
np.histogram2d提前获取两个子图的计数数据,计算出vmin和vmax,确保两个子图使用相同的颜色标尺。 - 共享色条添加:使用
fig.colorbar(..., ax=[ax1, ax2])将色条绑定到两个子图,自动布局在整体右侧。 - x轴格式修正:通过
ScalarFormatter(useOffset=False)和ticklabel_format(style='plain')强制x轴刻度使用常规小数格式,避免科学计数法。
内容的提问来源于stack exchange,提问作者Adnan
相关产品推荐
相关产品推荐

