Ну, нам недавно был дан проект создания симулятора естественного отбора, который отслеживает частоту аллелей через поколения, учитывая особую жизнеспособность каждой пары аллелей. Я сделал программу на python для печати графиков, и она работает нормально.pyplot и 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
Я искал переполнение стека для последней ошибки и обнаружил, что она возникает, когда число элементов х и у массивов не совпадает. Однако первая программа не дает этой ошибки.
О спасибо! Большая часть его исправлена, но есть и другая проблема. График последовательных графиков только на plt и, следовательно, последовательные сохраненные графики нарисуют предыдущие. –
Я добавил plt.clf(), чтобы очистить график после каждого чертежа. – tfv