2017-10-12 93 views
1

我想爲通過for循環繪製的每個繪圖使用下一種顏色。但是當我打電話給ax1._get_lines.prop_cycler.next()時,它不能達到第三種顏色。如何在.next().next()ax1._get_lines.prop_cycler.next()[k]中使用k in xrange()這樣的循環行?通過循環連續轉到ax._get_lines.prop_cycler.next()的下一個顏色

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

for k in xrange(4): 
    ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) 
    ax1._get_lines.prop_cycler.next() 
    ax1.plot(a[:,k]) 
    plt.legend(labels=lab[k:k+1]) 

plt.show() 

enter image description here

回答

0

在問題的代碼中,每個子圖都有自己的顏色週期,因此next爲您提供了每個子圖中軸的顏色循環的第二種顏色。

一個解決方案將是在所有子圖中共享相同的顏色循環。

如果是創建循環內的次要情節的情況下,你可以使用

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

for k in xrange(4): 
    ax1 = plt.subplot2grid((4, 1), (k, 0)) 
    if k==0: 
     c = ax1._get_lines.prop_cycler 
    else: 
     ax1._get_lines.prop_cycler = c 
    ax1.plot(a[:,k]) 
    plt.legend(labels=lab[k:k+1]) 

plt.show() 

,或者在次要情節創建一次性的情況下,

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

fig, axes = plt.subplots(4,1) 
for k, ax in enumerate(axes): 
    ax._get_lines.prop_cycler = axes[0]._get_lines.prop_cycler 
    ax.plot(a[:,k]) 
    ax.legend(labels=lab[k]) 

plt.show() 

當然你也可以中分別使用每個軸的色循環並將其傳播到下一種顏色

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 

lab = np.array(["A","B","C","E"]) 

fig, axes = plt.subplots(4,1) 
for k, ax in enumerate(axes): 
    for i in range(k): 
     next(ax._get_lines.prop_cycler) 
    ax.plot(a[:,k]) 
    ax.legend(labels=lab[k]) 

plt.show() 

在所有情況下,結果是這樣的:

enter image description here

0

與您的代碼的問題是,你在每一個循環創建一個新的軸實例,然後你做ax1._get_lines.prop_cycler.next()。由於ax1每次都是新對象,因此您總是會獲得相同的顏色。

最好的解決方案是明確地將顏色傳遞給圖。你應該能夠得到你想要的東西用下面的代碼,通過this example啓發:

import numpy as np 
import matplotlib.pyplot as plt 

a = np.cumsum(np.cumsum(np.random.randn(7,4), axis=0), axis=1) 
lab = np.array(["A","B","C","E"]) 

colors = plt.rcParams['axes.prop_cycle'] 
colors = colors.by_key()['color'] 

for (k, label), color in zip(enumerate(lab), colors): 
    ax1 = plt.subplot2grid((4, 1), (k, 0), rowspan=1, colspan=4) 
    ax1.plot(a[:,k], color=color) 
    plt.legend(labels=label) 

plt.show() 

:我的版本的代碼也避免了xrangenext()方法,在python3失敗。


警告:在您的示例中,您使用ax1._get_lines。通常以下劃線開頭的名字被認爲是私有的:因此,matplotlib開發人員可能隨時更改或刪除屬性_get_lines,恕不另行通知,並破壞您的代碼。我建議你儘可能使用公共API。

+0

我想你的意思是鏈接到一些與「這個例子中」?關於'next',我更新了[我以前的回答](https://stackoverflow.com/a/46672037/4124317)以包含python 2或3('next(ax._get_lines.prop_cycler)')的選項。 – ImportanceOfBeingErnest

+0

感謝您發現缺失的鏈接 –