Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中平滑图的问题_Python_Graph_Smoothing - Fatal编程技术网

Python中平滑图的问题

Python中平滑图的问题,python,graph,smoothing,Python,Graph,Smoothing,我一直在尝试平滑一个图,这是嘈杂的,因为我使用的采样率,以及它的计数。我一直在使用这里的帮助-主要是(虽然我找不到“spline”函数,所以我使用了univarentesline) 但是,无论我做什么,我都会不断得到pyplot错误,即“x和y的长度不相同”,或者scipi.UnivariateSpline的w值不正确。我不太清楚如何解决这个问题(不是一个真正的Python人!),我已经附加了代码,尽管它只是最后的绘图位导致了问题。谢谢 import os.path import matplot

我一直在尝试平滑一个图,这是嘈杂的,因为我使用的采样率,以及它的计数。我一直在使用这里的帮助-主要是(虽然我找不到“spline”函数,所以我使用了
univarentesline

但是,无论我做什么,我都会不断得到pyplot错误,即
“x和y的长度不相同”
,或者
scipi.UnivariateSpline
w
值不正确。我不太清楚如何解决这个问题(不是一个真正的Python人!),我已经附加了代码,尽管它只是最后的绘图位导致了问题。谢谢

import os.path
import matplotlib.pyplot as plt
import scipy.interpolate as sci
import numpy as np
def main():
    jcc = "0050"
    dj = "005"
    l = "060"
    D = 20
    hT = 4 * D
    wT1 = 2 * D
    wT2 = 5 * D
    for jcm in ["025","030","035","040","045","050","055","060"]:
        characteristic = "LeadersOnly/Jcm" + jcm + "/Jcc" + jcc + "/dJ" + dj + "/lambda" + l + "/Seed000"
        fingertime1 = []
        fingertime2 = []
        stamp =[]
        finger=[]
        for x in range(0,2500,50):
            if x<10000:
                z=("00"+str(x))
            if x<1000:
                z=("000"+str(x))
            if x<100:
                z=("0000"+str(x))
            if x<10:
                z=("00000"+str(x))
            stamp.append(x)
            path = "LeadersOnly/Jcm" + jcm + "/Jcc" + jcc + "/dJ" + dj + "/lambda" + l + "/Seed000/profile_" + str(z) + ".txt"
            if os.path.exists(path):
                f = open(path, 'r')
                pr1,pr2=np.genfromtxt(path, delimiter='\t', unpack=True)
                p1=[]
                p2=[]
                h1=[]
                h2=[]
                a1=[]
                a2=[]
                finger1 = 0
                finger2 = 0
                for b in range(len(pr1)):
                    p1.append(pr1[b])
                    p2.append(pr2[b])
                for elem in range(len(pr1)-80):
                    h1.append((p1[elem + (2*D)]-0.5*(p1[elem]+p1[elem + (4*D)])))
                    h2.append((p2[elem + (2*D)]-0.5*(p2[elem]+p2[elem + (4*D)])))
                    if h1[elem] >= hT:
                        a1.append(1)
                    else:
                        a1.append(0)
                    if h2[elem]>=hT:        
                        a2.append(1)
                    else:
                        a2.append(0)
                for elem in range(len(a1)-1):
                    if (a1[elem] - a1[elem + 1]) != 0:
                        finger1 = finger1 + 1
                finger1 = finger1 / 2
                for elem in range(len(a2)-1):
                    if (a2[elem] - a2[elem + 1]) != 0:
                        finger2 = finger2 + 1
                finger2 = finger2 / 2
                fingertime1.append(finger1)
                fingertime2.append(finger2)
                finger.append((finger1+finger2)/2)
        namegraph = jcm
        stampnew = np.linspace(stamp[0],stamp[-1],300)
        fingernew = sci.UnivariateSpline(stamp, finger, stampnew)
        plt.plot(stampnew,fingernew,label=namegraph)
    plt.show()      

main()
导入操作系统路径
将matplotlib.pyplot作为plt导入
导入scipy.interpolate作为sci
将numpy作为np导入
def main():
jcc=“0050”
dj=“005”
l=“060”
D=20
hT=4*D
wT1=2*D
wT2=5*D
对于[“025”、“030”、“035”、“040”、“045”、“050”、“055”、“060”中的jcm:
characteristic=“LeadersOnly/Jcm”+Jcm+“/Jcc”+Jcc+“/dJ”+dJ+“/lambda”+l+“/Seed000”
fingertime1=[]
fingertime2=[]
邮票=[]
手指=[]
对于范围(02500,50)内的x:
如果x 95 fingernew=sci.单变量样条线(戳记、指纹、戳记新)
96#打印(len(stampnew))
97#打印(len(fingernew))
/usr/lib/python2.6/dist-packages/scipy/interpolate/fitpack2.pyc in_uuu_uinit_uuu(self,x,y,w,bbox,k,s)
86#u data==x,y,w,xb,xe,k,s,n,t,c,fp,fpint,nrdata,ier
87数据=dfitpack.fpcurf0(x,y,k,w=w,
--->88 xb=bbox[0],xe=bbox[1],s=s)
89如果数据[-1]==1:
90#嵌套太小,设置为最大界限
错误:无法将dfitpack.fpcurf0的第一个关键字“w”转换为C/Fortran数组

让我们稍微分析一下您的代码,从范围(0、2500、50)内x的
开始:

  • 您将
    z
    定义为一个由6位数字组成的字符串,用0填充。您应该真正使用一些字符串格式,如
    z=“{0:06d}”.format(x)
    z=“%06d”%x
    ,而不是您的这些多个测试

  • 在循环结束时,
    stamp
    将包含
    (2500//50)=50个
    元素

  • 检查文件
    路径是否存在,然后打开并读取,但从未关闭。一种更具python风格的方法是:

    try:
        with open(path,"r") as f:
            do...
    except IOError:
        do something else
    
    使用
    With
    语法,您的文件将自动关闭

  • pr1
    pr2
    很可能是1D数组,对吗?您可以将
    p1
    p2
    列表的构造简化为:

    p1 = pr1.tolist()
    p2 = pr2.tolist()
    
  • 您的列表
    a1
    a2
    大小相同:您可以将
    for elem in range(len(a…)-1)
    循环组合成一个循环。您还可以使用
    np.diff
    功能

  • 在范围(…)循环中x的
    末尾,
    finger
    将有50个元素减去缺少的文件数。由于您不知道如何处理丢失的文件,因此您的
    戳记
    手指
    列表可能没有相同数量的元素,这将使
    scipy.UnivariateSpline
    崩溃。一个简单的修复方法是,仅当定义了
    路径
    文件时,才更新您的
    戳记
    列表(这样,它的元素数始终与
    finger
    相同)

  • stampnew
    数组有300个元素,而
    stamp
    finger
    最多只能有50个元素。这是第二个问题,权重数组(
    stampnew
    )的大小必须与输入的大小相同

  • 您最终尝试绘制
    fingernew
    vs
    stamp
    。问题是
    fingernew
    不是数组,它是
    单变量样条线的实例。您仍然需要计算一些实际点,例如使用
    fingernew(stamp)
    ,然后在
    plot
    函数中使用这些点


如果没有LeadersOnly文件夹,我们无法复制,不过如果您获得了追踪的准确副本,我们可能会找到答案。另外,我对代码将运行的缩进进行了一些调整。不确定解决方案-但请将0填充改为更好的方式!初始化z的行可以替换为
z='%06d'%x
已添加到我得到的一个错误链中。。。。如果我通过更改为stampnew=np.linspace(stamp[0],stamp[-1],50)来解决这个问题,我会得到其他错误,但随后会得到更多错误,这次是关于pyplot函数的错误
p1 = pr1.tolist()
p2 = pr2.tolist()