如何使用Matplotlib的TwoSlopeNorm修复拉伸的颜色条

vvppvyoh  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个函数,它的图像从0到无穷大,例如$f(x,y)=x^2 + y^2$。我想使用一个发散的颜色Map表来突出显示函数等于1的区域,并使用一个灵活的颜色条。颜色条应该从0到vmax,白色(“中心”)在1处,颜色之间的间隔应该与数字成比例。
在没有约束的情况下绘制时,白色区域的位置取决于vmin-vmax的范围。我希望将其固定为1,vmin不能小于0。我使用Matplotloib的TwtoSlopeNorm将中心设置为1部分解决了这个问题,无论vmin-vmax的范围是什么。但是这会导致颜色条的下半部分占用与上半部分一样多的空间,这是不正确的。* 颜色条被拉伸。* 尝试spacing="proportional"什么也不做。我如何让颜色条在0-1范围内使用与其他单位间隔一样多的空间,同时将白色固定为1?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cbook as cbook
from matplotlib import cm

delta = 0.01
x = np.arange(0, 2.001, delta)
y = np.arange(0.0, 2.001, delta)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2

cmap = cm.seismic

fig = plt.figure(figsize=(16,5))

ax = fig.add_subplot(131)
plt.pcolormesh(Z, cmap=cmap, vmin=0, vmax=9)
plt.title('White position depends on vmin-vmax range')
plt.colorbar(extend='max')

ax = fig.add_subplot(132)
plt.pcolormesh(Z, cmap=cmap, norm=colors.TwoSlopeNorm(vmin=0, vmax=9, vcenter=1))
plt.title('White position is fixed, but colorbar is streched')
plt.colorbar(extend='max')

ax = fig.add_subplot(133)
plt.pcolormesh(Z, cmap=cmap, norm=colors.TwoSlopeNorm(vmin=0, vmax=9, vcenter=1))
plt.title('spacing="proportional" does not work')
plt.colorbar(extend='max', spacing='proportional')

plt.show()

字符串
x1c 0d1x的数据

cbeh67ev

cbeh67ev1#

完整答案为here

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

delta = 0.01
x = np.arange(0, 4.001, delta)
y = np.arange(0.0, 4.001, delta)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2

fig = plt.figure(figsize=(6,3))
ax = fig.add_subplot(121)
m1 = plt.contourf(Z, cmap=cm.seismic, levels=np.arange(0,33,1), norm=colors.TwoSlopeNorm(vmin=0, vmax=32, vcenter=1), extend='max')
plt.colorbar(m1)

ax = fig.add_subplot(122)
m1 = plt.pcolormesh(Z, cmap=cm.seismic, norm=colors.TwoSlopeNorm(vmin=0, vmax=32, vcenter=1))
cb = plt.colorbar(m1, extend='max', spacing='proportional')
cb.ax.set_yscale('linear')

plt.tight_layout()
plt.show()

字符串


的数据

相关问题