2016-09-17 4 views
0

Ну, нам недавно был дан проект создания симулятора естественного отбора, который отслеживает частоту аллелей через поколения, учитывая особую жизнеспособность каждой пары аллелей. Я сделал программу на 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 

Я искал переполнение стека для последней ошибки и обнаружил, что она возникает, когда число элементов х и у массивов не совпадает. Однако первая программа не дает этой ошибки.

ответ

0

Возможно, я не совсем уверен, что вы пытаетесь, и было бы неплохо изменить пользовательские входы с фиксированными значениями в вашей программе, так как никто не знает ваулей для ваших входных параметров.

Тем не менее, я думаю, что ваша ошибка связана с неправильной инициализацией genp и genq для каждого цикла цикла.

Так что я сделал 2 изменения:

  • Я переместил инициализацию в петлю и
  • Я очистил genp и genq после каждого цикла петли

Надежда, которая решает свои проблемы.

Подсказка: Способ отследить вашу ошибку было бы проанализировать фактические размеры х и у в строке, где случилась ошибка, используя команду print len(x)

#!/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 
+0

О спасибо! Большая часть его исправлена, но есть и другая проблема. График последовательных графиков только на plt и, следовательно, последовательные сохраненные графики нарисуют предыдущие. –

+0

Я добавил plt.clf(), чтобы очистить график после каждого чертежа. – tfv

Смежные вопросы