更改值时将颜色条标签保持在旧位置

Posted

技术标签:

【中文标题】更改值时将颜色条标签保持在旧位置【英文标题】:Keeping colorbar labels at old position when changing their value 【发布时间】:2022-01-04 11:00:13 【问题描述】:

我最近开始使用彩条。我有一个看起来像这样的颜色条:

现在我想将它旁边的所有值 $x$ 更改为 $10^x$,但将新值保留在 $x$ 的原始位置。我试图通过使用:cbar.set_ticks([10**t for t in cbar.ax.get_yticks()])

现在颜色条代码部分如下所示:

kaart = ax.contourf(lons, lats, np.log10(Ui),cmap=plt.cm.BuGn, transform = ccrs.PlateCarree())
cbar =plt.colorbar(kaart)
cbar.set_label( label='Uncertainty in celcius', size = 20)
cbar.set_ticks([10**t for t in cbar.ax.get_yticks()])

但生成的颜色条看起来像:

我怎样才能将标签保留在原来的位置? 在此先感谢:)

【问题讨论】:

【参考方案1】:

一种解决方案是设置一个tick formatter,给定指数创建所需形式的标签。

更好的解决方案是在对contourf() 的调用中使用use locator=LogLocator()。使用LogLocator,您可以指定要细分的 10 的倍数。默认subs=(1,):仅精确到 10 的幂。将其更改为 subs=(1,2,) 将使用 10 的幂和 10 的两倍。

import matplotlib.pyplot as plt
from matplotlib.ticker import LogLocator, LogFormatterMathtext
import numpy as np

lons = np.linspace(0, 50, 20)
lats = np.linspace(0, 40, 10)
Ui = np.power(10, np.random.uniform(-2.8, 0.4, size=(10, 20)))

fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(16, 5))

kaart1 = ax1.contourf(lons, lats, np.log10(Ui), cmap='BuGn')
cbar1 = plt.colorbar(kaart1, ax=ax1)
cbar1.ax.yaxis.set_major_formatter(lambda x, pos: f'$10^x:.1f$')
ax1.set_title('Special purpose tick formatter')

kaart2 = ax2.contourf(lons, lats, Ui, locator=LogLocator(), cmap='BuGn')
cbar2 = plt.colorbar(kaart2, ax=ax2)
ax2.set_title('Default LogLocator')

kaart3 = ax3.contourf(lons, lats, Ui, locator=LogLocator(subs=(1, 2)), cmap='BuGn')
cbar3 = plt.colorbar(kaart3, ax=ax3)
cbar3.ax.yaxis.set_major_formatter(LogFormatterMathtext())
ax3.set_title('LogLocator(subs=(1, 2))')

plt.tight_layout()
plt.show()

【讨论】:

【参考方案2】:

你正在改变刻度的值,所以也许:

ticks = cbar.ax.get_yticks()
mylabels = [f'10**t' for t in ticks]
cbar.set_ticks(ticks, labels=mylabels)

但是,如果您真的要绘制数据的对数,请考虑在原始数据上绘制轮廓/pcolor 并使用 LogNorm:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
data = 10**np.random.randn(10, 10)
fig, ax = plt.subplots()
pc = ax.pcolormesh(data, norm=mcolors.LogNorm(vmin=10**-3, vmax=10**3))
fig.colorbar(pc)
plt.show()

【讨论】:

我刚刚用norm=LogNorm()而不是locator=LogLocator()尝试了contourf()的这种方法,令我惊讶的是,它也适用于那里。但是我没有找到影响细分数量的方法。例如。 contourf(..., norm=LogNorm(), levels=20) 我的测试数据仍然只显示 4 个颜色级别 (10**np.random.uniform(-2.8, 0.4, size=(10, 20)))。 自动选择级别是很棘手的,我认为直到最近日志规范可能一直存在错误。但是,如果您愿意,您始终可以手动指定级别。

以上是关于更改值时将颜色条标签保持在旧位置的主要内容,如果未能解决你的问题,请参考以下文章

根据滚动条位置更改导航栏颜色

在滚动视图滚动时更改标签位置

使用 gotoPopulation 时将代理保持在同一位置

输入文字后保持标签位置

XPages - 更改位置栏按钮的背景颜色

更改 spritekit 中的节点颜色