データの勾配を計算し、それを使用してアルファ値を設定することにより、一部のデータのマップにシェーディングを追加しようとしています。
データを読み込むことから始めます (残念ながら、準備中の多数の原稿で使用されているため、データを共有することはできません。編集 - 2020 年 12 月: 公開された論文は、Society of Exploration Geophysicistsライブラリでオープン アクセスで入手できます。データは付属の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 の回答で提案されたコードを使用すると、次の結果が得られます。
これは私が探していた効果をもたらします。シェーディングに関しては、HSV を使用するという titusjan 自身の提案が気に入っています。これにより、次の結果が得られます
。
ただし、呼び出したにもかかわらず、カラーマップをキューブヘリックスにすることができませんでした。
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()