2

既存の 2 つのカラーマップを重ねて新しいカラーマップを作成する簡単な方法はありますか?

私が達成しようとしているのは、カラーマップされた変数が大きな負の値から大きな正の値まで変化する、さらに別の色分けされた散布図を作成することです。ゼロ付近の値をトーンダウンしたいと思います---基本的に、カラーcm.Blues_rマップされた変数の負の値の場合はストック カラーマップ (たとえば ) から、cm.Orangesその変数の正の値の場合は 別のカラーマップ (たとえば )から色を選択できるようにしたいと考えています。

4

2 に答える 2

1

これはテストされていませんが、最初のパスとして、の単純なサブクラスを作成してみcolors.Colormapます。

class split_cmap(colors.Colormap):
    def __init__(self, cmap_a, cmap_b, split=.5):
        '''Makes a split color map cmap_a is the low range, 
           cmap_b is the high range
           split is where to break the range
        '''
        self.cmap_a, self.cmap_b = cmap_a, cmap_b
        self.split = split

    def __call__(self, v):
        if v < self.split:
            return self.cmap_a(v) 
            # or you might want to use v / self.split
        else:
            return self.cmap_b(v) 
            # or you might want to use (v - self.split) / (1 - self.split)

    def set_bad(self,*args, **kwargs):
        self.cmap_a.set_bad(*args, **kwargs)
        self.cmap_b.set_bad(*args, **kwargs)

    def set_over(self, *args, **kwargs):
        self.cmap_a.set_over(*args, **kwargs) # not really needed
        self.cmap_b.set_over(*args, **kwargs)

    def set_under(self, *args, **kwargs):
        self.cmap_a.set_under(*args, **kwargs)
        self.cmap_b.set_under(*args, **kwargs) # not really needed

    def is_gray(self):
        return False

colors.Colormapクラス定義

Normalizeクラスも掘り下げる必要があります。カラーマップはについてしか認識していないため、切り替えを実行する場所へのマップを[0, 1]確認する必要があります。norm.5

これを一般化して、マップと分割点のリストを取得し、必要な数のカラーマップを作成することができます。これには、あらゆる種類の健全性チェックも必要です。

入力を再正規化する場合は、これを使用して、既存のカラーマップの定期的なバージョンを作成、カラーマップとその逆のパートナーを渡すこともできます。

于 2013-03-14T01:24:07.013 に答える
0

特に色がほとんど含まれていない場合は、自分でカラーマップを作成する方が簡単だと思います。これはオレンジ-ホワイト-ブルーです。

cdict = {'red':   [ (0.0,   0.0, 0.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   1.0, 1.0)
                  ],
         'green': [ (0.0,   0.0, 0.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   0.65, 0.0)
                  ],
         'blue':  [ (0.0,   1.0, 1.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   0.0, 0.0)
                  ]
}
rwb_cmap = matplotlib.colors.LinearSegmentedColormap(name = 'rwb_colormap', colors = cdict, N = 256)

カラーマップは、RGB 値の辞書です。色ごとに、タプルのリストが異なるセグメントを提供します。各セグメントは、0 から 1 の範囲の z 軸に沿ったポイントです。レベルの色は、これらのセグメントから補間されます。

segment z-axis  end      start
i       z[i]    v0[i]    v1[i]
i+1     z[i+1]  v0[i+1]  v1[i+1]   
i+2     z[i+2]  v0[i+2]  v1[i+2]   

との間のレベルにはz[i]、と の間z[i+1]の色がv1[i]ありますv0[i+1]。これにより、色を「ジャンプ」することができます。v0[0]使用されv1[-1]ません。必要な数のセグメントを使用できます。(ここから適応: http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap )

Nは量子化レベルの数です。したがって、N = 256256 レベルのマップを補間します。私は怠惰から 256 を使用します。N = 64つの輪郭を設定して作成するときは注意が必要だと思います。

0.475 と 0.525 は、中央の輪郭が完全に白であることを確認するためのものです。レベル[-1.5, -0.5, 0.5, 1.5]の塗りつぶしがオレンジ-ホワイト-ブルーになりました。代わりに 0.5 を使用した場合、中間レベルは青みがかった色とオレンジ色がかった色の補間になります。

オレンジの RGB コードは 255-165-0 またはスケールが 0-1 の場合は 1-0.65-0 です。

于 2013-03-14T08:07:02.947 に答える