6

プロットには次のスクリプトを使用します。

import matplotlib

import matplotlib.pyplot as plt
import numpy as np
import pylab as pl
import math
import matplotlib as mpl
from matplotlib.ticker import MultipleLocator
from matplotlib.colors import LinearSegmentedColormap

cdict1 = {'red':   ((0.0, 1.0, 1.0),
                   (0.4, 1.0, 1.0),
                   (0.7, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

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

         'blue':   ((0.0, 1.0, 1.0),
                   (0.1, 0.0, 0.0),
                   (0.4, 0.0, 0.0),
                   (1.0, 1.0, 1.0))
        }

white_blue_red = LinearSegmentedColormap('WhiteBlueRed', cdict1)
plt.register_cmap(cmap=white_blue_red)

x = np.loadtxt('data.dat',
                 unpack=True)

plt.scatter(x[0], x[1], marker='.', s=3, linewidths=0, c=x[3], cmap= \
            plt.get_cmap('WhiteBlueRed')) # plt.cm.bwr  
plt.colorbar()

plt.show()

私が定義したカラーマップは、相対値 (関数 1 の最大値の 0 の最小値) を使用します。問題は、何百もの異なるファイルをプロットするためにそのコードを使用したいことであり、各プロットにまったく同じカラーマップが必要です。絶対値でカラーマップを定義する可能性はありますか? それは私の問題を解決するでしょう。

4

1 に答える 1

16

この場合のキーはnorm、カラーマップではなく です。

カラーマップは、既にスケーリングされたデータの色を定義します。はnorm、データを 0 ~ 1 の範囲にスケーリングします。

デフォルトでは、データまたはkwargs が指定されている場合は、その最小Normalize値と最大値の間でスケーリングするインスタンスが作成されます。vminvmax

ただし、あなたの場合に役立つかもしれないいくつかの異なるヘルパー関数があります。

norm個別のカラーバーが必要な場合は、 aと aの両方を生成するヘルパー関数がありcmapます。matplotlib.colors.from_levels_and_colors 値のリストと色のリストを受け取り、BoundaryNormインスタンスとインスタンスを返しLinearSegmentedColormapます。

例えば:

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

data1 = 3 * np.random.random((10, 10))
data2 = 5 * np.random.random((10, 10))

levels = [0, 1, 2, 3, 4, 5]
colors = ['red', 'brown', 'yellow', 'green', 'blue']
cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors)

fig, axes = plt.subplots(ncols=2)
for ax, dat in zip(axes, [data1, data2]):
    im = ax.imshow(dat, cmap=cmap, norm=norm, interpolation='none')
    fig.colorbar(im, ax=ax, orientation='horizontal')
plt.show()

ここに画像の説明を入力

これにより離散カラーマップが作成されることに注意してください。

代わりに連続カラーマップを使用したい場合は、同じ引数vminvmax引数を指定するか、独自のNormalizeインスタンスを作成normしてすべての画像の引数として渡すことができます。

また、色のリストから連続カラーマップを作成する同様の関数があります。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

data1 = 3 * np.random.random((10, 10))
data2 = 5 * np.random.random((10, 10))

colors = ['red', 'brown', 'yellow', 'green', 'blue']
cmap = LinearSegmentedColormap.from_list('name', colors)
norm = plt.Normalize(0, 5)

fig, axes = plt.subplots(ncols=2)
for ax, dat in zip(axes, [data1, data2]):
    im = ax.imshow(dat, cmap=cmap, norm=norm, interpolation='none')
    fig.colorbar(im, ax=ax, orientation='horizontal')
plt.show()

ここに画像の説明を入力

于 2015-09-24T21:26:56.460 に答える