2017-07-05 149 views
1

是可能的週期線的顏色與基本曲線在matplotlib.pyplot顏色循環用於多個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() 

這導致具有從所述循環器列表中的下一顏色的每個部分的正弦波曲線圖,它會必要時包裹:

Figure 1

我使用contour情節來繪製一個輪廓。對於每種情況,我想繪製一個輪廓,但我希望顯示的顏色自動循環通過指定的調色板(這樣我可以顯示可讀的彩色編碼圖例)。然而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

您可以在plt.contour中指定關鍵字colors。我不知道這是最好的解決辦法,但我寫了一個小的循環儀功能,爲你的顏色值,這樣我可以在該for -loop的每一次迭代養活他們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() 

的結果是這樣的:

contour plots

測試上的Python 3.5

+0

嗯,不錯用一個永久的發電機的功能 - 謝謝你。 – meowsqueak

1

既然你反正循環在你的參數,你可以簡單地遍歷在同一時間的顏色。

# 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

謝謝。在我的簡單例子中,我使用了一個循環,但實際上我需要「按需」繪製陰謀,循環並不那麼明確。不過,我的確認爲顏色可以指定爲「輪廓」的參數。我想我真正想要的是自動「基本顏色」循環功能是否存在,如線圖等 – meowsqueak

+0

此外,有趣的想法將數據組合成一個情節。 – meowsqueak