绘制数据结构的内部或外部“循环”

时间:2017-08-27 09:58:30

标签: python matplotlib

我经常在词典列表中组织我的数据。下面的示例显示了存储两种类型的线图,包括二次和线性类型,每种都有不同的常量。目前我的数据组织方式可以很容易地绘制为每种类型的图类更改常量的效果。但是,如果我想绘制图形类型对固定常数的影响呢?换句话说,我会有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的每个索引写出来。

2 个答案:

答案 0 :(得分:1)

首先,这是一个简洁的方法(imo)来解决你正在做的事情:你可以通过组合图形类型和const:lin1lin2来创建一种id。 .. quad4等。对于值,你可以使用map或list comprehension(我在下面使用了list comprehension)。因此,基本上data将是dict对象,其中包含多个列表(反过来又是每条曲线的[x_values, y_values]列表)。然后,您可以使用相同的主ID 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()

答案 1 :(得分:1)

看来你只想交换两个循环,

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