1. ホーム
  2. python

[解決済み] matplotlibでランダムな色を生成するには?

2022-12-22 03:45:41

質問

プロット関数に渡すためにランダムな色を生成する方法の簡単な例は何ですか?

私はループの中でscatterを呼び出していて、それぞれのプロットに異なる色をつけたいと思っています。

for X,Y in data:
   scatter(X, Y, c=??)

c: cは単一のカラーフォーマット文字列、長さNの色指定のシーケンス、またはkwargsで指定されたcmapとnormを使用して色にマッピングされるN個の数値のシーケンス(下記参照)であることが可能です。cは単一のRGBまたはRGBAの数値列であってはならないことに注意してください。なぜなら、それはカラーマップされる値の配列と区別がつかないからです。

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

<ブロッククオート

ループ内でscatterを呼び出していて、それぞれのプロットを異なる色で表示したいのですが、どうすればよいでしょうか。

それに基づいて、そしてあなたの答えに基づいて。あなたが実際に欲しいのは n 明確な の色をデータセットに追加します。 を整数のインデックスに対応させたい場合 0, 1, ..., n-1 を個別のRGB色にマッピングしたい。 みたいな感じ。

以下はそのための関数です。

import matplotlib.pyplot as plt

def get_cmap(n, name='hsv'):
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.'''
    return plt.cm.get_cmap(name, n)

での使用法 疑似 -コードスニペットを質問で使用します。

cmap = get_cmap(len(data))
for i, (X, Y) in enumerate(data):
   scatter(X, Y, c=cmap(i))


私は以下のコードで回答の図を生成しました。

import matplotlib.pyplot as plt

def get_cmap(n, name='hsv'):
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.'''
    return plt.cm.get_cmap(name, n)

def main():
    N = 30
    fig=plt.figure()
    ax=fig.add_subplot(111)   
    plt.axis('scaled')
    ax.set_xlim([ 0, N])
    ax.set_ylim([-0.5, 0.5])
    cmap = get_cmap(N)
    for i in range(N):
        rect = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(i))
        ax.add_artist(rect)
    ax.set_yticks([])
    plt.show()

if __name__=='__main__':
    main()

Python 2.7 & matplotlib 1.5 と Python 3.5 & matplotlib 2.0 の両方でテストしています。期待通りに動作しています。