python - 使用带有 matplotlib 的 brewer2mpl 发散颜色图,gamma 给出的结果很差,其值不同于 1
问题描述
在评论中向我介绍了在这个问题中使用颜色图。brewer2mpl
对于发散图(中间为零),我注意到伽玛的实现方式很简单,因此当它不等于 1 时会给出意想不到的 †</sup> 结果。中性色调表示零滑动因此接近零的值在 gamma = 0.5 时为蓝色,在 gamma = 1.5 时为橙色
无论如何要制作一个类似伽马的参数,它在零附近对称地运行,matplotlib
还是brewer2mpl
我只需要以某种方式手动完成它,通过提高np.abs(u)
到一些功率然后重新归一化并重新引入符号?
†</sup>预期的行为是对称地应用 gamma 关于零;至少这是我所期望的。
import numpy as np
import matplotlib.pyplot as plt
import brewer2mpl
Re = 6378137. # meters
J2 = 1.7555E+25 # m^5/s^2
hw = 400
x = np.linspace(-2.5*Re, 2.5*Re, 2*hw+1)
x, z = np.meshgrid(x, x)
r = np.sqrt(x**2 + z**2)
u = J2 * r**-5 * 0.5 * (3*z**2 - r**2)
u[r<Re] = np.nan
if True:
umax = np.nanmax(np.abs(u))
bmap = brewer2mpl.get_map('RdBu', 'Diverging', 9)
gammas = 0.5, 1, 1.5
plt.figure()
for i, gamma in enumerate(gammas):
cmap = bmap.get_mpl_colormap(N=100, gamma=gamma)
plt.subplot(1, 3, i+1)
plt.imshow(u, cmap=cmap, vmin=-umax, vmax=umax)
plt.colorbar()
plt.title('gamma = ' + str(gamma))
plt.plot([hw, hw], [0.3*hw, 1.7*hw], '-k')
plt.xlim(0, 2*hw+1)
plt.ylim(0, 2*hw+1)
plt.suptitle("Earth's geopotential's J2 component", fontsize=16)
plt.show()
解决方案
您可以创建两个颜色图,一个从红色到白色,一个从白色到蓝色。然后将伽玛应用于其中的每一个。最后从这些颜色图中获取颜色并使用组合颜色创建一个新颜色。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from copy import copy
cmap = plt.get_cmap("RdBu", lut=256)
# Create two new colormaps, each with one half of the original
cmap_lower = LinearSegmentedColormap.from_list("", cmap(np.arange(0,128)))
cmap_upper = LinearSegmentedColormap.from_list("", cmap(np.arange(128,256)))
gammas = [1, 0.5, 1.5]
fig, axs = plt.subplots(ncols=3, figsize=(8,5))
for ax, gamma in zip(axs, gammas):
# copy each colormap and set the respective gamma
cm1 = copy(cmap_lower)
cm1.set_gamma(gamma)
cm2 = copy(cmap_upper)
cm2.set_gamma(gamma)
# get the colors from the each
colors = np.concatenate((cm1(np.arange(0,256)), cm2(np.arange(0,256))), axis=0)
this_cmap = LinearSegmentedColormap.from_list("", colors)
im = ax.imshow(np.arange(300).reshape(30,10), cmap=this_cmap)
fig.colorbar(im, ax=ax)
ax.set_title(f"gamma={gamma}")
plt.show()
推荐阅读
- android - 为什么来自地址的 latlng 会导致找不到参数错误?
- vba - Screenscraping - 通过几个标签名到一个类名
- spring-webflux - 使用spring webflux一个接一个消费两个api
- rabbitmq - 访问rabbitMQ管理界面
- python - Core Julia Devs 在 Julia 中考虑了哪些 Python 样式的列表理解和生成器?
- ruby-on-rails - 如何在 Rails 中使用 Figaro 安全地存储电子邮件凭据
- kubernetes - Kubernetes nginx 入口配置不适用于 Grafana
- openproject - openproject配置抛出“错误1045(28000):用户'root'@'localhost'的访问被拒绝(使用密码:YES)”?
- jquery - 每个使用 jQuery 将 id 设置为 img
- r - 如何使用聚集和传播解决问题?(提迪尔)