5

私のアプリケーションでは、可能な場合はRからネイティブPython(scipy + matplotlib)に移行していますが、最大のタスクの1つは、Rヒートマップからmatplotlibヒートマップへの変換でした。この投稿は、移植について私を導きました。そのほとんどは無痛でしたが、私はまだカラーマップに確信が持てません。

コードを表示する前に、説明:Rコードで「ブレーク」を定義しました。つまり、最小値から10までの固定数のポイントで、理想的にはデータの中央値を中心にしています。ここでの同等のものは次のようになりますnumpy.linspace

# Matrix is a DataFrame object from pandas
import numpy as np

data_min = min(matrix.min(skipna=True))
data_max = max(matrix.max(skipna=True))
median_value = np.median(matrix.median(skipna=True))

range_min = np.linspace(0, median_value, 50)
range_max = np.linspace(median_value, data_max, 50)
breaks = np.concatenate((range_min, range_max))

これにより、着色に使用される100ポイントが得られます。ただし、Pythonでまったく同じことを行う方法がわかりません。現在私は持っています:

def red_black_green():
    cdict = {
       'red': ((0.0, 0.0, 0.0),
               (0.5, 0.0, 0.0),
               (1.0, 1.0, 1.0)),
       'blue': ((0.0, 0.0, 0.0),
                (1.0, 0.0, 0.0)),
       'green': ((0.0, 0.0, 1.0),
                 (0.5, 0.0, 0.0),
                 (1.0, 0.0, 0.0))
       }

    my_cmap = mpl.colors.LinearSegmentedColormap(
        'my_colormap', cdict, 100)

    return my_cmap

そしてさらに下に私はします:

# Note: vmin and vmax are the maximum and the minimum of the data

# Adjust the max and min to scale these colors
if vmin > 0:
    norm = mpl.colors.Normalize(vmin=0, vmax=vmax / 1.08)
else:
    norm = mpl.colors.Normalize(vmin / 2, vmax / 2)

数値は完全に経験的なものであるため、これをより堅牢なものに変更したいと思います。中央値に基づいてカラーマップを正規化するにはどうすればよいですか、または正規化が必要ですか?

4

1 に答える 1

4

デフォルトでは、matplotlibは、最大カラーマップ値がデータの最大値になるようにカラーマップを正規化します。同様に、最小限のデータについても同様です。これは、カラーマップの中央値(中央値)がデータの補間された中央値(正確に中央値にデータポイントがない場合に補間される)と一致することを意味します。

次に例を示します。

from numpy.random import rand
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

cdict = {'red':   ((0.0, 0.0, 0.0),
                   (0.5, 0.0, 0.0),
                   (1.0, 1.0, 1.0)),
         'blue':  ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),
         'green': ((0.0, 0.0, 1.0),
                   (0.5, 0.0, 0.0),
                   (1.0, 0.0, 0.0))}

cmap = mcolors.LinearSegmentedColormap(
'my_colormap', cdict, 100)

ax = plt.subplot(111)
im = ax.imshow(2*rand(20, 20) + 1.5, cmap=cmap)
plt.colorbar(im)
plt.show()

カラーバーの中央の値が2.5であることに注意してください。これはデータ範囲の中央値です:(最小+最大)/ 2 =(1.5 + 3.5)/ 2=2.5。

お役に立てれば。

于 2012-10-17T10:54:26.643 に答える