2017-07-05 3 views
1

それはmatplotlib.pyplotにおける基本的なプロットであるサイクルライン色することが可能である:カラーサイクリング

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k'])) 

x = np.linspace(-1.0, 1.0, 50) 
for f in [1.0, 2.0, 3.0, 4.0]: 
    ax.plot(x, np.sin(x * f)) 
plt.show() 

これはサイクラーリストから次の色を有する各部分正弦波プロットをもたらし、それは意志必要に応じてラップ:私は、単一の輪郭を描くためにcontourプロットを使用しています

Figure 1

。それぞれの場合について、1つの輪郭線を描画したいが、指定されたパレットを自動的に循環するように色を表示したい(したがって、色分けした凡例を表示できる)。しかしax.set_prop_cycleは、ここで同じ効果を持っていないようです:

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k'])) 

x = np.linspace(-1.0, 1.0, 50) 
y = np.linspace(-1.0, 1.0, 50) 
z = np.zeros((len(x), len(y))) 

# simple function to create useful contours: 
def get_z(x, y, f): 
    for i, u in enumerate(x): 
     for j, v in enumerate(y): 
      z[i, j] = (f * u) ** 2 + (f * v) ** 2 
    return z 

# plot for multiple values of `f` 
for f in [1.0, 2.0, 3.0, 4.0]: 
    ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2) 
plt.show() 

Figure 2

各プロット(リング)は、同じ色を持っている - それが自動的に循環していません。私はそれぞれのプロットに異なる色をつけたいと思っています。私はそれぞれの "完全な"等高線プロットが、1つのプロットの一部として描画された各輪郭の色を循環していることを知っていますが、私の場合は固定された "レベル"で単一の輪郭を描いています。

プロットごとに明示的に色を指定しなければ、これを行うのに合理的に簡単な方法はありますか?最終的にはプロットの動的な数をプロットすることを計画しているので、それらをすべて指定するのは実際的ではなく、必要なときに折り返す必要があります。

おそらく、輪郭プロットのカラーマップの開始オフセットを設定または回転する方法がありますか?

答えて

1

キーワードcolorsplt.contourに指定できます。私はfor - ループの各反復時にplt.contourにそれらを養うことができるように、これは可能な限り最高のソリューションであるかどうかは知らないが、私はあなたの色の値のための小さなサイクラー機能を書いた:

from matplotlib import pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 
##ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k'])) 

x = np.linspace(-1.0, 1.0, 50) 
y = np.linspace(-1.0, 1.0, 50) 
z = np.zeros((len(x), len(y))) 

# simple function to create useful contours: 
def get_z(x, y, f): 
    for i, u in enumerate(x): 
     for j, v in enumerate(y): 
      z[i, j] = (f * u) ** 2 + (f * v) ** 2 
    return z 

def col_cycler(cols): 
    count = 0 
    while True: 
     yield cols[count] 
     count = (count + 1)%len(cols) 

# plot for multiple values of `f` 
col_iter = col_cycler(['c','m', 'y','k']) 
for f in [1.0, 2.0, 3.0, 4.0, 5.0]: 
    ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=next(col_iter)) 
plt.show() 

結果は次のようになります。あなた以来のPython 3.5

+0

ああ、永久ジェネレータ関数の素敵な使用 - ありがとうございました。 – meowsqueak

1

でテスト

contour plots

あなたのパラメータを超えるとにかくループ、あなたは同時に色にわたる単にループがあります。

# plot for multiple values of `f` 
for f, c in zip([1.0, 2.0, 3.0, 4.0], ['c', 'm', 'y', 'k']): 
    ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=c) 

あるいは、プロット数が不明な場合、

colors = ['c', 'm', 'y', 'k'] 
for i,f in enumerate([1.0, 2.0, 3.0, 4.0]): 
    ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=colors[i%len(colors)]) 
plt.show() 

何のループを使用しない場合にのみ意味がありませんので、「明示的に各プロットの色を指定」したいべきではない引数。

ループなしで同じ結果を得るには、同じ等高線図に複数のレベルを指定し、カラーマップを使用することができます。

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

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = np.linspace(-1.0, 1.0, 50) 
y = np.linspace(-1.0, 1.0, 50) 
z = np.zeros((len(x), len(y))) 

# simple function to create useful contours: 
def get_z(x, y, f): 
    for i, u in enumerate(x): 
     for j, v in enumerate(y): 
      z[i, j] = (f * u) ** 2 + (f * v) ** 2 
    return z 

colors = ['c', 'm', 'y', 'k'] 
levels = 1./np.array([1.0, 2.0, 3.0, 4.0][::-1])**2 
cmcol = zip(plt.Normalize(levels.min(), levels.max())(levels),colors[::-1]) 

cmap=matplotlib.colors.LinearSegmentedColormap.from_list("m", cmcol) 
cont = ax.contour(x, y, get_z(x, y, 1), levels=levels, linewidth=2, cmap=cmap) 

plt.show() 

enter image description here

+0

ありがとうございます。私の単純な例ではループを使用しますが、現実には "オンデマンド"のプロットを描く必要があり、ループはそれほど明白ではありません。しかし、私は色を 'contour 'のパラメータとして指定できるというあなたの意見を取ります。私は実際に探していたと思うのは、ラインプロットなどのように自動 "ベースカラー"サイクリング機能が存在するかどうかということです。 – meowsqueak

+0

また、データを1つのプロットにまとめるという興味深い考えです。 – meowsqueak