14

言い換えれば、2 つの変数の関数として色が変化するヒートマップ (またはサーフェス プロット) を作成したいと考えています。(具体的には、輝度 = マグニチュード、色相 = フェーズ。)これを行うネイティブな方法はありますか? 同様のプロットの例:

マグニチュード用とフェーズ用の 2 つのカラーバーを使用します。

大きさにはカラーバーを使用し、位相には円形の凡例を使用します

2D カラーバーを使用して、両方の変数の変化を示します

私がやりたいことの正確な(?)いくつかの良い例。

天文学からのより多くの例ですが、非知覚的な色相を使用しています

編集:これは私がそれで行ったことです: https://github.com/endolith/complex_colormap

4

4 に答える 4

9

imshow[r, g, b] エントリの配列を取ることができます。したがって、絶対値を強度と位相、つまり色相に変換できます。

例として複素数を使用します。これが最も理にかなっているからです。必要に応じて、いつでもnumpy配列を追加できますZ = X + 1j * Y

したがって、データZには、たとえば使用できます

imshow(complex_array_to_rgb(Z))

どこで(編集:この提案のおかげでより速く、より良くなりました)

def complex_array_to_rgb(X, theme='dark', rmax=None):
    '''Takes an array of complex number and converts it to an array of [r, g, b],
    where phase gives hue and saturaton/value are given by the absolute value.
    Especially for use with imshow for complex plots.'''
    absmax = rmax or np.abs(X).max()
    Y = np.zeros(X.shape + (3,), dtype='float')
    Y[..., 0] = np.angle(X) / (2 * pi) % 1
    if theme == 'light':
        Y[..., 1] = np.clip(np.abs(X) / absmax, 0, 1)
        Y[..., 2] = 1
    elif theme == 'dark':
        Y[..., 1] = 1
        Y[..., 2] = np.clip(np.abs(X) / absmax, 0, 1)
    Y = matplotlib.colors.hsv_to_rgb(Y)
    return Y

たとえば、次のようになります。

Z = np.array([[3*(x + 1j*y)**3 + 1/(x + 1j*y)**2
              for x in arange(-1,1,0.05)] for y in arange(-1,1,0.05)])
imshow(complex_array_to_rgb(Z, rmax=5), extent=(-1,1,-1,1))

ここに画像の説明を入力

imshow(complex_array_to_rgb(Z, rmax=5, theme='light'), extent=(-1,1,-1,1))

ここに画像の説明を入力

于 2013-06-14T16:42:23.313 に答える
6

imshowNxMx3 (rbg) または NxMx4 (grba) 配列を使用するため、「手動で」カラー マッピングを行うことができます。

サブクラス化してベクトルをスケーラーにマップし、カスタムカラーマップを非常Normalizeに巧妙にレイアウトすることで、少し牽引力を得ることができるかもしれません(しかし、これは次元の 1 つをビン化する必要があると思います)。

私はこのようなことをしました ( pdf リンク、24 ページの図を参照) が、コードは含まれていますMATLAB(そして私のアーカイブのどこかに埋もれています)。

2 変量カラー マップが役立つことに同意します (主に、何をしても小川を上る非常に密集したベクトル フィールドを表す場合)。明らかな拡張は、カラー マップに複雑な引数を持たせることだと思います。Normalizeそれにはandの特殊なサブクラスが必要でありColormap、実装するのに多くの作業がかかると思われる場合は、行ったり来たりしています。手動で動作させると、APIのラングリングの問題になると思います。

于 2013-03-15T15:06:28.290 に答える