更改值时将颜色条标签保持在旧位置
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))
)。
自动选择级别是很棘手的,我认为直到最近日志规范可能一直存在错误。但是,如果您愿意,您始终可以手动指定级别。以上是关于更改值时将颜色条标签保持在旧位置的主要内容,如果未能解决你的问题,请参考以下文章