matplotlibのFigure内のプロットされたラインごとに新しい色を選択するにはどうすればよいですか?


109

プロットされた線ごとに色を指定せず、各線に異なる色を設定します。しかし、実行すると:

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

それから私はこの出力を取得します:

上記のコードによって出力されたグラフの画像

上の画像を見ると、matplotlibが異なるラインごとに色を選択しようとしていることがわかりますが、最終的には色を再利用します-上位10のラインは下位10と同じ色を使用しています。私は、すでに使用されている色を繰り返さないようにしたり、使用する色のリストをフィードしたりしたくありません。

回答:


59

matplotlib 1.5以降

使用できますaxes.set_prop_cycle)。

matplotlib 1.0-1.4

使用できますaxes.set_color_cycle)。

matplotlib 0.x

使用できますAxes.set_default_color_cycle


1
私が探していたものに沿ってもっと...カラーマップを使用してN色のリストを生成する方法に関する情報を追加できる可能性はありますか?
dlamotte

19
@xyld -あまりにも私自身の答えを差し込みますが、例では、この答えの一番下にありますすることはありません:stackoverflow.com/questions/4805048/...は、基本的にはこれを実行します[colormap(i) for i in np.linspace(0, 0.9, num_plots)]colormap中にカラーマップの一つであるmatplotlib.pyplot.cmnumplots番号ですあなたが欲しいユニークな色の。ただし、色を区別するのが難しいことに注意してください。
Joe Kington、2011

4
素敵な答えのジョー、そしてxyldの質問に答えるように思えるので、これはそのままにしておきます。また、ただし、stackoverflow.com
questions / 470690 /…

それはどんなプロットでも機能しますか?Axes3Dでset_prop_cycleを試してから、ax.plot_wireframe()を使用して複数のプロットにforループを使用しましたが、2つのプロットが同じ色で着色されています。
ジュンホパーク

112

私は通常、次の2つ目を使用します。

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

2の例: iter、next colorのプロット例


#2を使用しました。プロットする必要のあるチャンネルのリストがありますが、それらはさまざまな長さにすることができます。そのリストのn = lenを設定すると、選択した色が範囲を超えていることを確認し、違いを確認できるので非常に役立ちます。その数が多すぎると、色の違いがわかりにくくなります。
モーブ2015

私は#1を使用しました
。enumerate

11

prop_cycle

color_cycleこの一般化のために1.5では非推奨になりました:http : //matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

また、(今ひどく命名)の例に示す:http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html:で述べたhttps://stackoverflow.com/a/4971431/895245

matplotlib 1.5.1でテスト済み。


9

色を自動的に変更できるかどうかはわかりませんが、ループを利用してさまざまな色を生成できます。

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

この場合、色は黒から100%緑まで変化しますが、必要に応じて調整できます。

参照してくださいmatplotlibのプロット()のドキュメントのための、ルックcolorキーワード引数を。

色のリストをフィードする場合は、リストが十分に大きいことを確認し、ループのインデックスを使用して色を選択します

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])

1
ええ、私は一種のこのようなことを避けたいと思っていました。私はカラーマップを調べましたが、それらの使用方法はかなり混乱しています。
dlamotte

このソリューションは、カラーマップを制御する簡単な方法を生み出しません
Ryszard Cetnarski

これは、特にset_prop_cycleが失敗した場合に非常に便利です。Axes3Dのplot_wireframe()でset_prop_cycleまたは自動カラーリングが失敗する理由がわかりません。しかし、これは着色のための一種の基本的な/手動の解決策です。
ジュンホパーク

6

次のような定義済みの「定性的カラーマップ」を使用できます。

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

matplotlib 3.0.3でテスト済み。を呼び出せない理由については、https://github.com/matplotlib/matplotlib/issues/10840を参照してくださいaxes.set_prop_cycle(color=cmap)

事前定義された定性的カラーマップのリストは、https://matplotlib.org/gallery/color/colormap_reference.htmlで入手できます

定性的カラーマップのリスト


これらの最初の3色が順番に使用されることに注意してください
ベンジョーンズ

2

matplotlibrcファイルのデフォルトのカラーサイクルを変更することもできます。そのファイルの場所がわからない場合は、Pythonで次の操作を行います。

import matplotlib
matplotlib.matplotlib_fname()

これにより、現在使用されているmatplotlibrcファイルへのパスが表示されます。そのファイルには、他の多くの設定の中にも、の設定がありますaxes.color.cycle。希望する色のシーケンスを入力するだけで、作成するすべてのプロットでそれを見つけることができます。matplotlibですべての有効なhtmlカラー名を使用することもできます。


0

以下のようチロの答えのノートは、使用することができますprop_cycleを通じてサイクルにmatplotlibのために色のリストを設定します。しかし、何色ですか?多数のプロットに同じカラーサイクルを使用し、線の数を変えたい場合はどうしますか?

1つの戦術は、https://gamedev.stackexchange.com/a/46469/22397のような式を使用して、各色がその前にあるすべての色と大幅に異なるようにする無限の色のシーケンスを生成することです。

残念ながら、prop_cycle無限シーケンスは受け入れられません-シーケンスを渡すと永久にハングします。しかし、たとえば、そのようなシーケンスから生成された最初の1000色を取得して、それをカラーサイクルとして設定できます。そうすれば、正気な数の線があるプロットでは、区別できる色が得られます。

例:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

出力:

上記のコードによるグラフ出力

今、すべての色が異なります-私はそれらのいくつかを区別するのに苦労していることは認めますが!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.