好吧,最近我们给了一个项目来制作一个自然选择模拟器,该模拟器根据每个等位基因对的特定特定生存力,通过世代追踪等位基因的频率。我在python中创建了一个程序来打印图表并且它工作得非常好。
在这里。
#!/usr/bin/env python
import matplotlib.pyplot as plt
print ("Number of generations:")
n=int(input())
genp=[]
genq=[]
print ("What is p:")
p=float(input())
genp.append(p)
toap=1-p
genq.append(toap)
print ("What is w11:")
w11=float(input())
print ("What is w12:")
w12=float(input())
print ("What is w22:")
w22=float(input())
for i in range(1,n):
genp.append((genp[i-1]*(genp[i-1]*w11+genq[i-1]*w12))/(genp[i-1]*genp[i-1]*w11+2*genp[i-1]*genq[i-1]*w12+genq[i-1]*genq[i-1]*w22))
genq.append(1-genp[i])
plt.plot(range(0,n),genp,'r-',label='A')
plt.plot(range(0,n),genq,'b--',label='a')
plt.xlabel('Generations')
plt.ylabel('Allele Frequency')
plt.legend(loc='upper left')
plt.axis([0, n, -0.01, 1.01])
plt.title('p='+str(p)+' w11='+str(w11)+' w12='+str(w12)+' w22='+str(w22)+' for '+str(n)+' generations.', fontsize=14, fontweight='bold')
plt.savefig('graphP-'+str(p)+'w11-'+str(w11)+'w12-'+str(w12)+'w22-'+str(w22)+'.png')
plt.show()
现在,我决定变得有点懒,让程序完成迭代不同的viabilities值的工作。
这是我如何修改它。
#!/usr/bin/env python
import matplotlib.pyplot as plt
import numpy as np
print ("Number of generations:")
n=int(input())
genp=[]
genq=[]
print ("What is p:")
p=float(input())
genp.append(p)
toap=1-p
genq.append(toap)
for l in range(1,10):
for j in range(1,10):
for k in range(1,10):
w11=l*0.1
w12=j*0.1
w22=k*0.1
for i in range(1,n):
genp.append((genp[i-1]*(genp[i-1]*w11+genq[i-1]*w12))/(genp[i-1]*genp[i-1]*w11+2*genp[i-1]*genq[i-1]*w12+genq[i-1]*genq[i-1]*w22))
genq.append(1-genp[i])
plt.plot(range(0,n),genp,'r-',label='A')
plt.plot(range(0,n),genq,'b--',label='a')
plt.xlabel('Generations')
plt.ylabel('Allele Frequency')
plt.legend(loc='upper left')
plt.axis([0, n, -0.01, 1.01])
plt.title('p='+str(p)+' w11='+str(w11)+' w12='+str(w12)+' w22='+str(w22)+' for '+str(n)+' generations.', fontsize=14, fontweight='bold')
plt.savefig('graphP-'+str(p)+'w11-'+str(w11)+'w12-'+str(w12)+'w22-'+str(w22)+'.png')
我不知道为什么但执行此程序会导致错误。
Traceback (most recent call last):
File "./iterative.py", line 30, in <module>
plt.plot(range(0,n),genp,'r-',label='A')
File "/usr/lib/python3.5/site-packages/matplotlib/pyplot.py", line 3153, in plot
ret = ax.plot(*args, **kwargs)
File "/usr/lib/python3.5/site-packages/matplotlib/__init__.py", line 1819, in inner
return func(ax, *args, **kwargs)
File "/usr/lib/python3.5/site-packages/matplotlib/axes/_axes.py", line 1382, in plot
for line in self._get_lines(*args, **kwargs):
File "/usr/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 381, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):
File "/usr/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 359, in _plot_args
x, y = self._xy_from_xy(x, y)
File "/usr/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 219, in _xy_from_xy
raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension
我搜索了堆栈溢出的最后一个错误,发现当x和y数组中的元素数量不同时会出现这种情况。但是第一个程序没有给出这个错误。
答案 0 :(得分:0)
我可能不完全确定你在尝试什么,并且在程序中更改用户输入与固定值的比较可能是一个好主意,因为没有人知道输入参数的值。
尽管如此,我认为你的错误与没有为每个循环周期正确初始化genp和genq有关。
所以我做了两处改动:
希望能解决您的问题。
提示:跟踪错误的一种方法是使用print len(x)
等命令分析发生错误的行的x和y的实际尺寸p>
#!/usr/bin/env python
import matplotlib.pyplot as plt
import numpy as np
print ("Number of generations:")
n=int(input())
genp=[]
genq=[]
print ("What is p:")
p=float(input())
for l in range(1,10):
for j in range(1,10):
for k in range(1,10):
# Move this part of code into your loop for initialization
genp.append(p)
toap=1-p
genq.append(toap)
# end
w11=l*0.1
w12=j*0.1
w22=k*0.1
for i in range(1,n):
genp.append((genp[i-1]*(genp[i-1]*w11+genq[i-1]*w12))/(genp[i-1]*genp[i-1]*w11+2*genp[i-1]*genq[i-1]*w12+genq[i-1]*genq[i-1]*w22))
genq.append(1-genp[i])
plt.plot(range(0,n),genp,'r-',label='A')
plt.plot(range(0,n),genq,'b--',label='a')
plt.xlabel('Generations')
plt.ylabel('Allele Frequency')
plt.legend(loc='upper left')
plt.axis([0, n, -0.01, 1.01])
plt.title('p='+str(p)+' w11='+str(w11)+' w12='+str(w12)+' w22='+str(w22)+' for '+str(n)+' generations.', fontsize=14, fontweight='bold')
plt.savefig('graphP-'+str(p)+'w11-'+str(w11)+'w12-'+str(w12)+'w22-'+str(w22)+'.png')
#clear plot
plt.clf()
# Empty ypur lists after each run
genp=[]
genq=[]
#end