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

如何手动修改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)的显示范围和刻度,具体修改如下:

  1. 捕获contourf的返回对象,用于后续自定义颜色条
  2. 手动设置色标的显示范围、整数刻度,并添加两端延伸标记(提示数据范围未覆盖色标全范围)

修改后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:45:21