1. ホーム
  2. python

matplotlib で線の色を設定するために Colormaps を使用する

2023-09-16 16:58:06

質問

matplotlib で、実行時に提供されるスカラー値で線の色を設定するには、カラーマップ (例えば jet )? 私はここでいくつかの異なるアプローチを試してみましたが、私は困っていると思います。 values[] はスカラーを並べた配列、curves は1次元の配列、labels は文字列の配列です。各配列は同じ長さです。

fig = plt.figure()
ax = fig.add_subplot(111)
jet = colors.Colormap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
lines = []
for idx in range(len(curves)):
    line = curves[idx]
    colorVal = scalarMap.to_rgba(values[idx])
    retLine, = ax.plot(line, color=colorVal)
    #retLine.set_color()
    lines.append(retLine)
ax.legend(lines, labels, loc='upper right')
ax.grid()
plt.show()

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

このエラーは jet . 基底クラスである Colormap を 'jet' という名前で作成していますが、これは 'jet' カラーマップのデフォルト定義を取得することとは全く異なります。この基底クラスは決して直接作成してはならず、サブクラスのみをインスタンス化する必要があります。

あなたの例で発見されたことは、Matplotlibのバグ的な動作です。このコードが実行されたとき、より明確なエラーメッセージが生成されるはずです。

これはあなたの例の更新版です。

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

# define some random data that emulates your indeded code:
NCURVES = 10
np.random.seed(101)
curves = [np.random.random(20) for i in range(NCURVES)]
values = range(NCURVES)

fig = plt.figure()
ax = fig.add_subplot(111)
# replace the next line 
#jet = colors.Colormap('jet')
# with
jet = cm = plt.get_cmap('jet') 
cNorm  = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
print scalarMap.get_clim()

lines = []
for idx in range(len(curves)):
    line = curves[idx]
    colorVal = scalarMap.to_rgba(values[idx])
    colorText = (
        'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2])
        )
    retLine, = ax.plot(line,
                       color=colorVal,
                       label=colorText)
    lines.append(retLine)
#added this to get the legend to work
handles,labels = ax.get_legend_handles_labels()
ax.legend(handles, labels, loc='upper right')
ax.grid()
plt.show()

結果的に

を使うことで ScalarMappable を使用することは、私の関連する回答で提示されたアプローチよりも改善されています。 matplotlibを使用して20以上のユニークな凡例色を作成する