如何手动修改Matplotlib色标刻度,固定两端值且不改变色阶?
问题描述
我有一份名为ChangeEU的变化数据集,结构如下:
Latitude Longitude Altitude Value O18d 0 30.0 -30.0 0.0 1.262094 1.262094 1 30.0 -29.9 0.0 1.269815 1.269815 ... ... ... ... ... ... 359999 69.9 59.9 68.0 -1.229575 -1.365575
使用以下Python代码(基于Matplotlib、Basemap)绘制等值线填充图:
import numpy as np from matplotlib import pyplot as plt from mpl_toolkits import basemap from scipy.stats import norm from mpl_toolkits.basemap import Basemap from matplotlib import colors from matplotlib.patches import Path, PathPatch import pandas as pd from Data_Prep_Paper import * def load_ChangeEU(): ChangeEU = dflediffan return ChangeEU def base_data(ChangeEU): return{ 'late':np.array(ChangeEU['Latitude']), 'lone':np.array(ChangeEU['Longitude']), 'vale':np.array(ChangeEU['O18d']), } def plot_Diff(data): fig = plt.figure(figsize=(10, 10)) ax =fig.add_subplot(221) ax.set_title("Annual Change EU PRÜFEN OB DATEN DIE RICHTIGEN SIND", fontsize = 10) m = basemap.Basemap(llcrnrlon=-30, llcrnrlat=30,urcrnrlon=60,urcrnrlat=70, resolution='l',area_thresh=1000) m.drawcoastlines(color = 'black') x,y = m(data['lone'],data['late']) divnorm=colors.TwoSlopeNorm(vmin=-8., vcenter=0., vmax=3) m.contourf(x,y,data['vale'],32, tri=True,norm=divnorm, cmap = 'PuBu_r') plt.colorbar(location='bottom',pad=0.04,fraction=0.08) # 路径处理代码省略 ChangeEU = load_ChangeEU() base_data = base_data(ChangeEU) plot_Diff(base_data) plt.show()
当前输出图的色标显示小数刻度,我希望将色标的深蓝色端设为-10、红色端设为2,且不改变现有颜色缩放比例。此前尝试ticks等方法未成功,求可行实现方案。
解决方案
要实现需求,你需要保留原有数据的颜色映射逻辑,仅调整色标(Colorbar)的显示范围和刻度,具体修改如下:
- 捕获
contourf的返回对象,用于后续自定义颜色条 - 手动设置色标的显示范围、整数刻度,并添加两端延伸标记(提示数据范围未覆盖色标全范围)
修改后的plot_Diff函数关键代码:
def plot_Diff(data): fig = plt.figure(figsize=(10, 10)) ax =fig.add_subplot(221) ax.set_title("Annual Change EU PRÜFEN OB DATEN DIE RICHTIGEN SIND", fontsize = 10) m = basemap.Basemap(llcrnrlon=-30, llcrnrlat=30,urcrnrlon=60,urcrnrlat=70, resolution='l',area_thresh=1000) m.drawcoastlines(color = 'black') x,y = m(data['lone'],data['late']) # 保留原有颜色缩放逻辑,不变动divnorm参数 divnorm=colors.TwoSlopeNorm(vmin=-8., vcenter=0., vmax=3) # 捕获contourf的返回对象cs cs = m.contourf(x,y,data['vale'],32, tri=True,norm=divnorm, cmap = 'PuBu_r') # 自定义颜色条 cbar = plt.colorbar(cs, location='bottom', pad=0.04, fraction=0.08, extend='both') # 设置色标显示范围为-10到2 cbar.set_clim(-10, 2) # 设置整数刻度,可根据需求调整间隔 cbar.set_ticks(np.arange(-10, 3, 2)) # 可选:添加色标标签 cbar.set_label('O18d Annual Change') # 路径处理代码省略
关键说明
divnorm参数完全保留,确保原有颜色缩放比例不变(数据的颜色映射逻辑和之前一致)set_clim(-10, 2)强制色标显示范围为-10到2,两端用延伸标记(extend='both')提示数据未覆盖该范围set_ticks(np.arange(-10, 3, 2))设置整数刻度,替换默认的小数刻度,间隔可根据需求调整(比如改成1:np.arange(-10, 3, 1))
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

