将颜色条刻度从 10 的幂更改为纯数字

Posted

技术标签:

【中文标题】将颜色条刻度从 10 的幂更改为纯数字【英文标题】:Change colorbar ticks from powers of 10 to plain numbers 【发布时间】:2022-01-02 19:50:59 【问题描述】:

我正在尝试读取 .nc 文件并在地图上显示数据。我希望颜色条刻度不是 10 次方,而是纯数字,所以从 0.1 到 10。此外,如果我可以格式化它,让它在 7 个刻度中从 0.1 到 10,那将是受欢迎的,所以结果与附图中的相同。

请注意,我没有添加与数据下载相关的代码sn -p,所以脚本无法运行。如果您不运行代码就无法发现错误,请告诉我,我会附上它,以便您下载 .nc 文件。

这是我正在使用的代码。对不起,多余的导入。

import xarray as xr
import cartopy
import matplotlib
from matplotlib.colors import LogNorm
from matplotlib.offsetbox import AnchoredText
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter
import sys
import os

#First we open the dataset and read the varaible of interest
ds = xr.open_dataset(OUTPUT_FILENAME)
chl = ds.CHL.sel(time=min_date)

#Setting the figure size and projection
fig = plt.figure(figsize=(15,15))
ax = plt.axes(projection=ccrs.PlateCarree())

#Adding coastlines and land
ax.coastlines(resolution="10m") #Coastline resolution
ax.set_extent([-9,2,35,37.6]) #Map extent
ax.add_feature(cartopy.feature.LAND) #Adding land
#Formatting colorbar <---------------------------------------------------DOES NOT WORK
ax.ticklabel_format(style='plain',useMathText=None)

#Adding gridlines
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                  linewidth=0.5, color='black', alpha=0.7, linestyle='--')
gl.top_labels = False
gl.right_labels = False

#Adding lat/lon labels in the axes
ax.text(-0.07, 0.55, 'Latitude [deg]', va='bottom', ha='center',
        rotation='vertical', rotation_mode='anchor',
        transform=ax.transAxes)
ax.text(0.5, -0.2, 'Longitude [deg]', va='bottom', ha='center',
        rotation='horizontal', rotation_mode='anchor',
        transform=ax.transAxes)

#Adding (C) info to the figure
SOURCE = 'ICMAN CSIC'
text = AnchoredText('$\copyright$ '.format(SOURCE),
                    loc=1, prop='size': 9, frameon=True)
ax.add_artist(text)

#Drawing the plot
chl.plot(ax=ax, transform=ccrs.PlateCarree(),
         vmin=0.1, vmax=10, extend='both', cbar_kwargs='shrink': 0.2, 'pad':0.01,
         cmap="jet", norm=LogNorm(vmax=10))


#Figure title
ax.set_title("Chlorophyll NN (mg/m$^3$) "+ min_date_h + " - " + max_date_h)

【问题讨论】:

【参考方案1】:

颜色条应该是图中的最后一个轴 (fig.axes[-1])。 您可以手动设置颜色栏的刻度和刻度标签:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors

X, Y = np.mgrid[-3:3:100j, -2:2:100j]
Z = 10*np.exp(-X**2 - Y**2)

fig, ax = plt.subplots()
pcm = ax.pcolor(X, Y, Z, norm=colors.LogNorm(vmin=.1, vmax=10), cmap='jet')
fig.colorbar(pcm, ax=ax)

cb = fig.axes[-1]
ticks = [.1,.2,.5,1,2,5,10]
cb.yaxis.set_ticks(ticks, labels=[f"t:g" for t in ticks])
cb.minorticks_off()

(在 matplotlib 3.5.0 之前,您必须分别设置刻度和标签)。

【讨论】:

非常感谢@Stef !!

以上是关于将颜色条刻度从 10 的幂更改为纯数字的主要内容,如果未能解决你的问题,请参考以下文章

如何将颜色代码图例从对数刻度转换为实际值?

Matplotlib - 如何使用对数刻度设置线图的颜色条

角材料更改垫复选框内的刻度颜色

将颜色条的标签从递增值更改为递减值

如何更改 Matplotlib 中颜色条刻度标签的字体大小?

matplotlib自定义设置plt.colorbar函数配置颜色条的刻度数实战:自定义设置颜色条刻度并为刻度值进行命名和标签化