0

そのため、matplotlib で symlog スタイルのカラー スケールを実装しようとしています。値を 0-1 の領域にスケーリングし、カスタム カラーバー ティックとラベルを使用してこれを行っています。

マスクを使用して 3 つのセクションで値をスケーリングしていますが、期待どおりに機能していません。

私は最初にこれを行います:

negMask = ma.masked_greater_equal(Z, -10**thresh, copy=True).mask
posMask = ma.masked_less_equal(Z, 10**thresh, copy=True).mask
linMask = ma.masked_outside(Z, -10**thresh, 10**thresh, copy=True).mask

3つのマスクを手に入れるために、私は欲しいです。次に、 を 0-1 領域にスケーリングし始めます。

sizeNeg = int(np.ceil(log10(-minZ)) - thresh)
sizePos = int(np.ceil(log10(maxZ)) - thresh)
sizeLin = 2
totSize = sizeNeg + sizePos + sizeLin

Z.mask = negMask
Z = (-np.log10(-Z) - thresh) / totSize

ここで停止してプロットすると、期待どおりに動作します。プロットの小さなセクションを次に示します。

ここに画像の説明を入力

見ることができる場所では、負の値がプロットされますが、正の部分はプロットされません-マスクされているためです。

次に、マスクを正の値のマスクに変更します。

Z.mask = posMask
Z = (np.log10(Z) - thresh + sizeNeg + sizeLin) / totSize

しかし、これを行うと、以前はマスクされていたすべての値がすべて1.0. そこにあったデータはなくなっています。

これが私が意味することの例です:

$ python
Python 2.6.6 (r266:84292, Sep 11 2012, 05:25:09) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> from numpy.ma import masked_where as mw
>>> a = np.arange(0,10,1)
>>> a = mw(False, a)
>>> a
masked_array(data = [0 1 2 3 4 5 6 7 8 9],
             mask = False,
       fill_value = 999999)

>>> mask1 = mw(a>4,a).mask
>>> mask2 = mw(a<6,a).mask
>>> mask1
array([False, False, False, False, False,  True,  True,  True,  True,  True], dtype=bool)
>>> mask2
array([ True,  True,  True,  True,  True,  True, False, False, False, False], dtype=bool)
>>> a.mask = mask1
>>> a
masked_array(data = [0 1 2 3 4 -- -- -- -- --],
             mask = [False False False False False  True  True  True  True  True],
       fill_value = 999999)

>>> a = np.log10(a)
__main__:1: RuntimeWarning: divide by zero encountered in log10
>>> a
masked_array(data = [-- 0.0 0.301029995664 0.47712125472 0.602059991328 -- -- -- -- --],
             mask = [ True False False False False  True  True  True  True  True],
       fill_value = 999999)

>>> a.mask = mask2
>>> a
masked_array(data = [-- -- -- -- -- -- 1.0 1.0 1.0 1.0],
             mask = [ True  True  True  True  True  True False False False False],
       fill_value = 999999)

マスクされた配列で使用np.log10すると、マスクされた値が台無しになるため、マスクを解除すると、それらは all になり1.0ます。

アレイをリージョンごとに 1 つずつ、3 つの別々のアレイに分割できることはわかっていますが、後でそれらを再び結合するにはどうすればよいでしょうか?

4

0 に答える 0