1. ホーム
  2. python

matplotlib を使って独自のカラーマップを作成し、カラースケールをプロットする

2023-07-25 06:32:42

質問

私は、-2から+2までの値に対応する独自のカラーマップ(赤-混合-紫-混合-青)を作成し、私のプロットでポイントを着色するためにそれを使用したいと思います。 そして、プロットはカラースケールを右側に持っている必要があります。



これが今のところ私がマップを作成する方法です。でも、色が混ざっているのかどうかはよくわかりません。

cmap = matplotlib.colors.ListedColormap(["red","violet","blue"], name='from_list', N=None)
m = cm.ScalarMappable(norm=norm, cmap=cmap)



このように、色と値を対応させています。

colors = itertools.cycle([m.to_rgba(1.22), ..])



そして、プロットしてみます。

for i in range(0, len(array_dg)):
  plt.plot(array_dg[i], markers.next(),alpha=alpha[i], c=colors.next())



私の悩みは

1. カラースケールをプロットできない。

2. 私のスケールが継続的な(滑らかな)カラースケールを作成しているかどうか完全にわからない。

どのように解決するのですか?

の例があります。 を作成する方法があります。 . の意味を理解するために、docstring は重要です。 cdict . それを理解した上で、例えば cdict をこのように使います。

cdict = {'red':   ((0.0, 1.0, 1.0), 
                   (0.1, 1.0, 1.0),  # red 
                   (0.4, 1.0, 1.0),  # violet
                   (1.0, 0.0, 0.0)), # blue

         'green': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.1, 0.0, 0.0),  # red
                   (0.4, 1.0, 1.0),  # violet
                   (1.0, 1.0, 0.0))  # blue
          }

とはいえ cdict 形式は多くの柔軟性を与えてくれますが、私は単純な グラデーションの場合、その形式はかなり直感的ではありません。以下は、それを助けるユーティリティ関数です。 単純なLinearSegmentedColormapsを生成するためのユーティリティ関数です。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors


def make_colormap(seq):
    """Return a LinearSegmentedColormap
    seq: a sequence of floats and RGB-tuples. The floats should be increasing
    and in the interval (0,1).
    """
    seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
    cdict = {'red': [], 'green': [], 'blue': []}
    for i, item in enumerate(seq):
        if isinstance(item, float):
            r1, g1, b1 = seq[i - 1]
            r2, g2, b2 = seq[i + 1]
            cdict['red'].append([item, r1, r2])
            cdict['green'].append([item, g1, g2])
            cdict['blue'].append([item, b1, b2])
    return mcolors.LinearSegmentedColormap('CustomMap', cdict)


c = mcolors.ColorConverter().to_rgb
rvb = make_colormap(
    [c('red'), c('violet'), 0.33, c('violet'), c('blue'), 0.66, c('blue')])
N = 1000
array_dg = np.random.uniform(0, 10, size=(N, 2))
colors = np.random.uniform(-2, 2, size=(N,))
plt.scatter(array_dg[:, 0], array_dg[:, 1], c=colors, cmap=rvb)
plt.colorbar()
plt.show()

<イグ


ちなみに for-loop

for i in range(0, len(array_dg)):
  plt.plot(array_dg[i], markers.next(),alpha=alpha[i], c=colors.next())

を呼び出すごとに1点ずつプロットします。 plt.plot . これは少数の点では動作しますが、多数の点では非常に遅くなります。 plt.plot は1色でしか描画できませんが plt.scatter は各ドットに異なる色を割り当てることができます。このように plt.scatter がお勧めです。