我试图通过计算数据的梯度并使用它来设置 alpha 值来为某些数据的映射添加阴影。
我首先加载我的数据(不幸的是,我无法共享这些数据,因为它正在准备中的许多手稿中使用。编辑 - 2020 年 12 月:已发表的论文可在勘探地球物理学家协会图书馆开放访问,并且数据可通过随附的Jupyter Notebook获得):
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from pylab import imread, imshow, gray, mean
import matplotlib.colors as cl
%matplotlib inline
data = np.loadtxt('data.txt')
plt.imshow(data, cmap='cubehelix')
plt.show()
给我一张数据图:
然后我计算总水平梯度并将其归一化以用于着色:
dx,dy = np.gradient(data, 1, 1)
tdx=np.sqrt(dx*dx + dy*dy)
tdx_n=(tdx-tdx.min())/(tdx.max()-tdx.min())
tdx_n=1-tdx_n
看起来和我预期的一样:
plt.imshow(tdx_n[4:-3,4:-3], cmap='bone')
plt.show()
为了创建阴影效果,我想我会从数据图中获取颜色,然后用渐变替换不透明度,以便使深色阴影与渐变成比例,如下所示:
img_array = plt.get_cmap('cubehelix')(data[4:-3,4:-3])
img_array[..., 3] = (tdx_n[4:-3,4:-3])
plt.imshow(img_array)
plt.show()
但结果不是我所期望的:
这就是我正在寻找的(在 Matlab 中创建,颜色图不同):
关于如何修改我的代码的任何建议?
更新使用 Ran Novitsky 的方法,使用 titusjan 的答案中建议的代码,我得到以下结果:
这给出了我正在寻找的效果。在阴影方面,虽然我确实喜欢 titusjan 自己使用 HSV 的建议,它给出了这样的结果:
.
但是,即使我要求它,我也无法将颜色图设为 cubehelix:
from matplotlib.colors import rgb_to_hsv, hsv_to_rgb
hsv = rgb_to_hsv(img_array[:, :, :3])
hsv[:, :, 2] = tdx_n
rgb = hsv_to_rgb(hsv)
plt.imshow(rgb[4:-3,4:-3], cmap='cubehelix')
plt.show()