2016-12-07 69 views
0

我似乎無法弄清楚如何根據一些簡單的邏輯來改變matplotlib中的linecolor。基於邏輯改變matplotlib中的線顏色

舉例來說,假設我有:

import numpy as np 
from matplotlib import pyplot as plt 

A = [1,2,3,4,5] 
B = [2,4,6,8,10] 
C = [1,3,5,6,7] 
D = [1,2,3,3,3] 
combined = [A,B,C,D] 

現在,讓我們說,我想matplotlib繪製這是一個線圖。因此,根據每個列表的組合,應該有4條單獨的行。

我想添加條件,如果列表中的數字(組合)大於5,那麼各條線是藍色的。否則,讓個別行變成橙色。

我該如何去做這樣的事情?我知道以下內容會將其繪製得很好。

np_combined = np.array(combined) 
times = np.linspace(0,1,5) 
plt.plot(times,np_combined.T) 

我需要雙循環嗎?我嘗試了不止幾次,但似乎每次都會收到錯誤。

for h in np_combined: 
    for k in range(5): 
     if k > 5: 
      plt.plot(times,k,color = 'blue') 
     else: 
      plt.plot(times,k,color = 'orange') 

錯誤是EOL同時根據您嘗試掃描字符串字面

+0

你試過什麼類型的錯誤? – rassar

+0

編輯我的嘗試 – DudeWah

回答

1

,嘗試:

for sublist in np_combined: 
    if max(sublist) > 5: 
     plt.plot(times,sublist,color = 'blue') 
    else: 
     plt.plot(times,sublist,color = 'orange') 

此外,由於你的錯誤是你缺少一個結束引號(這就是EOL手段),錯誤可能在另一行。

+0

這太棒了。我很傷心,我沒有使用max。解決了它。 它應該是:plt.plot(times,sublist,color ='b') – DudeWah

+0

@DudeWah你是對的,答案已更新。 – rassar

2

rassar's answer,使用條件選擇顏色(或繪製樣式)是否正確。對於簡單的情況,這非常好。

對於更復雜的情況,只要爲他們設置自己,還有另一種選擇:決策功能。您通常在d3jsBokeh和可視化應用程序中看到這些內容。

對於一個簡單的例子,它是這樣的:

color_choice = lambda x: 'blue' if x > 5 else 'orange' 

for sublist in np_combined: 
    plt.plot(times, sublist, color=color_choice(max(sublist))) 

這裏color_choice也可以是一個傳統的函數定義。使用lambda函數僅僅是因爲它是一個簡短的單線程。

對於簡單的情況,定義一個選擇函數可能不會比條件更好。但是說你也想定義一個線條樣式,而不是使用與顏色選擇相同的條件。例如: -

for sublist in np_combined: 
    largest = max(sublist) 
    if largest > 5: 
     if largest > 10: 
      plt.plot(times, sublist, color='blue', ls='--') 
     else: 
      plt.plot(times, sublist, color='blue', ls='-') 
    else: 
     if largest <= 2: 
      plt.plot(times, sublist, color='orange', ls='.') 
     else: 
      plt.plot(times, sublist, color='orange', ls='-') 

現在你在一個混亂的泡菜,因爲你只是相對簡單的顏色和線條的選擇這麼多的代碼。這是重複性的,違反了軟件工程原理,引發錯誤。

決策功能,可以極大地清理一下:

color_choice = lambda x: 'blue' if x > 5 else 'orange' 

def line_choice(x): 
    if x > 10: return '--' 
    if x > 2: return '-' 
    return '.' 

for sublist in np_combined: 
    largest = max(sublist) 
    plt.plot(times, sublist, 
      color=color_choice(largest)), 
      ls=line_choice(largest)) 

這不僅清理了代碼,本地化決策邏輯,它可以更容易地改變你的顏色,樣式,和其他選擇,因爲你的程序演變。美中不足的是Python缺乏AFIAK,D3的excellent selection of mapping functions, aka "scales"

+0

這是如此翔實,真的會在未來幫助我。非常感謝你花時間寫出所有明確的內容。 – DudeWah