pyplot和python。保存多个图表

时间:2016-09-17 05:33:05

标签: python matplotlib graph

好吧,最近我们给了一个项目来制作一个自然选择模拟器,该模拟器根据每个等位基因对的特定特定生存力,通过世代追踪等位基因的频率。我在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数组中的元素数量不同时会出现这种情况。但是第一个程序没有给出这个错误。

1 个答案:

答案 0 :(得分:0)

我可能不完全确定你在尝试什么,并且在程序中更改用户输入与固定值的比较可能是一个好主意,因为没有人知道输入参数的值。

尽管如此,我认为你的错误与没有为每个循环周期正确初始化genp和genq有关。

所以我做了两处改动:

  • 我将初始化移动到循环中
  • 我在每个循环周期后清除了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