2017-08-27 37 views
-1

我經常在詞典列表中組織我的數據。下面的例子顯示了存儲兩種類型的線性圖,一種是二次型和一種線性型,每種都有不同的常量。我的數據組織方式目前可以很容易地繪製出改變每種類型圖類的常量的效果。然而,如果我想繪製一個固定常數的圖形類型的效果呢?換句話說,我會有4個數字,每行兩行。我必須對data是如何組織的,因此不能重寫該數據結構的創建。任何想法爲乾淨pythonic方式做到這一點?繪製數據結構的內部或外部「循環」

import numpy as np 
import matplotlib.pyplot as plt 


x = np.linspace(-1,1,20) 

y1 = lambda x,c : x+c 
y2 = lambda x,c : c*np.power(x,2) 

y1(x,1) 
y2(x,2) 


# Create data structure 
keys = ["quad", "lin"] 
const = [1,2,3,4] 
data = {} 

for key in keys: 
    data[key] = [] 
    for c in const: 
     graph = {} 

     graph["x"] = x 
     if key == "lin": 
      graph["y"] = y1(x,c) 
     if key == "quad": 
      graph["y"] = y2(x,c) 
     data[key].append(graph) 





# Plots for same line type 
for key,graphs in data.iteritems(): 
    plt.figure() 
    for g in graphs: 
     plt.plot(g["x"],g["y"]) 


plt.show() 

enter image description here enter image description here

我要的是遍歷在外繪圖環路c值,這樣的效果是:

# Plots for same constant 
plt.figure() 
plt.plot(data["quad"][0]['x'],data["quad"][0]['y']) 
plt.plot(data["lin"][0]['x'],data["lin"][0]['y']) 

plt.figure() 
plt.plot(data["quad"][1]['x'],data["quad"][1]['y']) 
plt.plot(data["lin"][1]['x'],data["lin"][1]['y']) 

plt.figure() 
plt.plot(data["quad"][2]['x'],data["quad"][2]['y']) 
plt.plot(data["lin"][2]['x'],data["lin"][2]['y']) 

plt.figure() 
plt.plot(data["quad"][3]['x'],data["quad"][3]['y']) 
plt.plot(data["lin"][3]['x'],data["lin"][3]['y']) 

而是明確地寫了這一點,每個const索引我想循環。

+0

我曾嘗試更新預期的效果應該是什麼。謝謝。 – Jack

回答

1

看來你只是想交換的兩個循環,

for c in range(len(const)): 
    plt.figure() 
    for k in keys: 
     plt.plot(data[k][c]['x'],data[k][c]['y']) 
1

首先,下面是一個簡潔的方法(imo)來解決你在做什麼:你可以通過結合圖形類型和const:lin1,lin2 ... quad4等來製作一種id。你可以使用地圖或列表理解值(我已經使用列表理解,下面)。所以基本上data將是dict對象與其中的幾個列表(這反過來是每個曲線[x_values, y_values]列表)。然後,您可以迭代相同的主要標識lin1, quad4, etc並使用plt.show()繪製圖。

import numpy as np 
import matplotlib.pyplot as plt 


x = np.linspace(-1,1,20) 

y1 = lambda x,c : x+c 
y2 = lambda x,c : c*np.power(x,2) 

y1(x,1) 
y2(x,2) 

# Create data structure 
keys = ["quad", "lin"] 
const = [1,2,3,4] 
data = {} 

for key in keys: 
    for num in const: 
     data[key+str(num)]=[x,[[y1,y2][key=="lin"](e,num) for e in x]] 

# Plots for same line type 
for i in keys: 
    plt.figure() 
    for j in const: 
     plt.plot(x,data[i+str(j)][1]) 
    plt.show() 

如果你想爲同一個常數4個不同的地塊,只要使用此:

for j in const: 
    plt.figure() 
    for i in keys: 
     plt.plot(x,data[i+str(j)][1]) 
    plt.show() 
相關問題