web-dev-qa-db-ja.com

1つの図でプロトコルごと異なる色の線を取得する方法

プロットを作成するためにmatplotlibを使用しています。私はPythonで自動的に生成されるべき異なる色で各プロットを識別しなければなりません。

同じ図の中でプロットごとに色を変える方法を教えてください。

164
pottigopi

Matplotlibはデフォルトでこれを行います。

例えば。:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

Basic plot demonstrating color cycling

そして、すでにご存知のとおり、凡例を簡単に追加できます。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Basic plot with legend

循環する色を制御したい場合は、次の手順を実行します。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Plot showing control over default color cycling

それが少し役立つことを願っています!あなたがmatplotlibに慣れていないのであれば、 チュートリアルは始めるのに良い場所です

編集:

1つの図にプロットしたいものがたくさんある(> 5)場合、まず、

  1. それらを異なるプロットに配置します(1つの図にいくつかのサブプロットを使用することを検討します)、または
  2. 色を区別するために色以外のもの(マーカーのスタイルや線の太さ)を使用します。

そうでなければ、あなたはとても面倒なプロットに巻きつくことになるでしょう!あなたがしていることを何でも読んでいる人に親切にして、15の異なるものを1つの図に詰め込もうとしないでください!

それを超えて、多くの人々はさまざまな程度に色盲になっています、そしてあなたが理解するよりも多くの人々にとって微妙に異なる色の間の区別は困難です。

そうは言っても、あなたが本当に20本の比較的異なる色で1本の軸上に20本の線を置きたいのなら、これをする1つの方法があります:

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.Gist_ncar
plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

Unique colors for 20 lines based on a given colormap

348
Joe Kington

後で設定する

プロットしようとしているプロットの数がわからない場合は、.linesを使用してプロットから直接番号を取得してプロットした後で色を変更できます。このソリューションを使用します。

ランダムデータ

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

必要なコード

colormap = plt.cm.Gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])


ax1.legend(loc=2)

結果は次のとおりです。 enter image description here

32
G M

私は前回の投稿で与えられた最後のループの回答にマイナーな改良を提供したいと思います(その投稿は正しいので、まだ受け入れられるべきです)。最後の例をラベル付けするときに行われた暗黙の前提は、plt.label(LIST)がラベル番号XをLISTに、X番目のplotが呼び出された行に対応する行に置くことです。私は以前にこの方法で問題に遭遇しました。 matplotlibsのドキュメント( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item )に従って凡例を作成してラベルをカスタマイズするための推奨される方法はラベルは正確にプロットされていると思います。

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**: Matplotlibの伝説が動かない

2
Tommy

TL; DRいいえ、できません自動的に。はい、可能です。

Figure(axes)の各プロット(figure)には独自の色のサイクルがあります - 各プロットに異なる色を強制しない場合、すべてのプロットは同じ色の順序を共有します。

自動的に各プロットで異なる色を持つことができるのは、stretch「自動」の意味。


OPが書いた

[...]各プロットを[Matplotlib]によって自動的に生成されるべき異なる色で識別しなければなりません。

しかし... ... Matplotlibはそれぞれ異なる曲線に対して異なる色を自動的に生成します

In [10]: import numpy as np 
    ...: import matplotlib.pyplot as plt                                                  

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));                                             
Out[11]: 

enter image description here

それではなぜOP要求?読み続けていると、

同じ図の中でプロットごとに色を変える方法を教えてください。

なぜなら、各プロット(Matplotlibの用語ではそれぞれのaxes)はそれ自身のcolor_cycle(あるいはむしろ2018年にはそれ自身のprop_cycle)とそれぞれのプロット(axes)は同じ順序で同じ色を再利用するからです。

In [12]: fig, axes = plt.subplots(2,3)                                                    

In [13]: for ax in axes.flatten(): 
    ...:     ax.plot((0,1), (0,1)) 

enter image description here

これが元の質問の意味である場合、1つの可能性は各プロットに異なる色を明示的に付けることです。

(よくあることですが)プロットがループで生成される場合は、Matplotlibによって選択された色automaticを上書きする追加のループ変数が必要です。

In [14]: fig, axes = plt.subplots(2,3)                                                    

In [15]: for ax, short_color_name in Zip(axes.flatten(), 'brgkyc'): 
    ...:     ax.plot((0,1), (0,1), short_color_name)

enter image description here

もう一つの可能​​性は、Cyclerオブジェクトをインスタンス化することです

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

enter image description here

type(my_cycler)cycler.Cyclerですがtype(actual_cycler)itertools.cycleです。

1
gboffi