【问题标题】:Python Colormap for displaying difference in the high value range用于显示高值范围差异的 Python Colormap
【发布时间】:2019-06-05 11:05:39
【问题描述】:
是否有任何颜色图可以显示图像的高值范围内的差异,如果没有(因为我发现没有 cm)有没有办法由 msyself 定义它并将其作为参数 cmap 提供给 seaborn/matplotlib 绘图?我已经尝试过对数颜色缩放,但很难定义只有最高 10% 的图像应该清楚地具有很好的色差,其余的可能是黑色的。
所以我有一个图像/数组,其数字在 0 到 2000 之间。我只有在 1800 到 2000 之间的数字之间有明显的不同。
有没有办法做到这一点?
【问题讨论】:
标签:
python
matplotlib
colors
seaborn
【解决方案1】:
使用imshow 的vmin 和vmax 参数,您可以将颜色范围限制为1800 到2000。如果您希望将较低的值映射为黑色,您可以使用cmap.set_under(black)。
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(-7,7,301)
x,y = np.meshgrid(t,t)
z1 = np.sin(x)*np.cos(6*y) + np.cos(12*x*y)/6
z2 = np.exp(-((x-2)**2+(y-2)**2)*3)
z = (z1*6/7+1)*100+1800-z2*1949
cmap=plt.get_cmap("viridis")
cmap.set_under("black")
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(9,3.0))
im1 = ax1.imshow(z, cmap=cmap)
fig.colorbar(im1, ax=ax1)
im2 = ax2.imshow(z, vmin=1800, vmax=2000, cmap=cmap)
fig.colorbar(im2, ax=ax2)
ax1.set_title("Original")
ax2.set_title("Linear between 1800 and 2000")
plt.show()
【解决方案2】:
这不完全是您想要的,但您可以尝试单独绘制两个组,我的意思是:
vals = np.array([1,2,3,101,120,150])
xs = np.arange(6)
ys = np.arange(6)
mask = vals>100
vals2 = vals[mask]
xs1 = xs[mask]
xs2 = xs[np.logical_not(mask)]
ys1 = ys[mask]
ys2 = ys[np.logical_not(mask)]
plt.scatter(xs2,ys2,c='black')
plt.scatter(xs1,ys1,c=vals2)
plt.show()
当然,您可以调整第二个绘图的颜色图,以便将“有趣”点与其他点区分开来