在Python中平滑图形的问题

时间:2012-04-22 16:22:47

标签: python graph smoothing

由于我正在使用的采样率以及它正在计算的数量,我一直试图平滑一个噪声很大的情节。我一直在使用这里的帮助 - 主要是Plot smooth line with PyPlot(虽然我找不到“样条”功能,所以使用UnivarinteSpline代替)

但是,无论我做什么,我都会遇到"x and y are not of the same length"scipi.UnivariateSpline的{​​{1}}值不正确的pyplot错误。我不太确定如何解决这个问题(不是真正的Python人!)我已经附加了代码,尽管它只是最后的绘图位导致了问题。感谢

w

有关信息,数据输入文件只是一个整数列表(两个列表由选项卡分隔,如代码所示)。

以下是我收到的错误代码之一:

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()

1 个答案:

答案 0 :(得分:4)

让我们从for x in range(0, 2500, 50):

开始分析您的代码
  • 您将z定义为以0填充的6位数字符串。您应该使用像z = "{0:06d}".format(x)z = "%06d" % x这样的字符串格式,而不是您的这些多次测试。

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

  • 您检查文件是否存在path,然后打开并阅读,但您永远不会关闭它。更多的Pythonic方式是:

    try:
        with open(path,"r") as f:
            do...
    except IOError:
        do something else
    

    使用with语法,您的文件会自动关闭。

  • pr1pr2可能是一维数组,对吧?您可以真正简化p1p2列表的构建:

    p1 = pr1.tolist()
    p2 = pr2.tolist()
    
  • 您的列表a1a2具有相同的大小:您可以将for elem in range(len(a..)-1)个圈组合在一个中。您也可以使用np.diff功能。

  • for x in range(...)循环结束时,finger将有50个元素减去丢失文件的数量。由于您不知道在文件丢失的情况下该怎么做,因此stampfinger列表可能没有相同数量的元素,这会导致scipy.UnivariateSpline崩溃。一个简单的解决方法是仅在stamp文件被定义时更新path列表(这样,它始终与finger具有相同数量的元素。)

    < / LI>
  • stampnewstamp最多只有50个时,您的finger数组有300个元素。这是第二个问题,即权重数组的大小({ {1}})必须与输入的大小相同。

  • 您最终会尝试绘制stampnew vs fingernew。问题是stamp 一个数组,它是fingernew实例。您仍然需要计算一些实际点数,例如使用UnivariateSpline,然后在fingernew(stamp)函数中使用它。