30

私が取り組んでいる論文のいくつかの図をプロットするために matplotlib を使用しようとしています。2D numpy 配列に 2 つのデータ セットがあります。

import matplotlib.pyplot as pp
import numpy as np

hillshade = np.genfromtxt('hs.asc', delimiter=' ', skip_header=6)[:,:-1]

pp.imshow(hillshade, vmin=0, vmax=255)
pp.gray()
pp.show()

これにより、次のことが得られます。

ヒルシェイド

そして、風景を横切って流れる川の特性を描写する 2 番目の ASCII ラスター。このデータは上記と同じ方法でプロットできますが、河川ネットワークに対応しない配列内の値には、-9999 のデータなし値が割り当てられます。目的は、データなしの値を透明に設定して、川の値が陰影起伏の上に重なるようにすることです。

これは川のデータです。理想的には、ここで 0 として表されるすべてのピクセルが完全に透明になります。

河川データ

これについていくつかの調査を行ったところ、データを RGBA 配列に変換し、不要なセルのみを透明にするようにアルファ値を設定できるようです。ただし、リバー配列の値は浮動小数点数であり、変換できません (元の値は図の全体のポイントであるため) imshow。 RGBA 形式を使用する場合、関数は符号なし整数のみを受け取ることができると思います。

この制限を回避する方法はありますか? 単純にピクセル値とアルファ値のタプルを作成し、そのようにプロットできることを望んでいましたが、これは不可能のようです。

またPIL、データ値が透明ではない河川データの PNG ファイルを作成しようと試みましたが、これにより、ピクセル値が 0 ~ 255 に自動的にスケーリングされ、保存する必要がある値が失われます。

この問題について誰かが持っている洞察を歓迎します。

4

3 に答える 3

51

「川」配列をマスクするだけです。

例えば

rivers = np.ma.masked_where(rivers == 0, rivers)

この方法で 2 つのプロットを重ねる簡単な例として、次のようにします。

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

# Generate some data...
gray_data = np.arange(10000).reshape(100, 100)

masked_data = np.random.random((100,100))
masked_data = np.ma.masked_where(masked_data < 0.9, masked_data)

# Overlay the two images
fig, ax = plt.subplots()
ax.imshow(gray_data, cmap=cm.gray)
ax.imshow(masked_data, cmap=cm.jet, interpolation='none')
plt.show()

ここに画像の説明を入力

また、imshow余談ですが、RGBA 形式の float を喜んで受け入れます。すべてが 0 から 1 の範囲にあることを期待しているだけです。

于 2013-06-18T13:46:58.373 に答える
18

マスクされた配列を使用せずにこれを行う別の方法は、カラー マップが最小値を下回るクリッピング値を処理する方法を設定することですclim(恥知らずに Joe Kington の例を使用します)。

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

# Generate some data...
gray_data = np.arange(10000).reshape(100, 100)

masked_data = np.random.random((100,100))

my_cmap = cm.jet
my_cmap.set_under('k', alpha=0)


# Overlay the two images
fig, ax = plt.subplots()
ax.imshow(gray_data, cmap=cm.gray)
im = ax.imshow(masked_data, cmap=my_cmap, 
          interpolation='none', 
          clim=[0.9, 1])
plt.show()

例

set_over上部をクリッピングするための とset_bad、カラー マップがデータ内の「不適切な」値を処理する方法を設定するためのもあります。

climこの方法の利点は、調整するだけでしきい値を変更できることですim.set_clim([bot, top])

于 2013-06-18T21:04:48.840 に答える