Python中平滑图的问题

2024-10-01 17:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试平滑一个由于我使用的采样率和它的计数而产生噪音的绘图。我一直在这里使用帮助-主要是Plot smooth line with PyPlot(虽然我找不到“spline”函数,所以使用了UnivarinteSpline

但是,无论我做什么,我总是得到错误的pyplot错误"x and y are not of the same length",或者{}的{}的值不正确。我不太确定如何解决这个问题(不是一个真正的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()

对于信息,数据输入文件只是一个整数列表(如代码所示,由制表符分隔的两个列表)。在

以下是我得到的一个错误代码:

^{pr2}$

Tags: pathina2forifstampa1range
1条回答
网友
1楼 · 发布于 2024-10-01 17:26:14

让我们分析一下您的代码,从for x in range(0, 2500, 50):开始

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

  • 在循环的末尾,stamp将有(2500//50)=50元素。

  • 检查文件path是否存在,然后打开并读取它,但从未关闭过它。更像Python的方法是:

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

    使用with语法,文件将自动关闭。

  • pr1和{}很可能是1D数组,对吧?您可以将p1p2列表的构造简化为:

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

  • for x in range(...)循环的末尾,finger将有50个元素减去丢失的文件数。由于您没有告诉您如何处理丢失的文件,stamp和{}列表的元素数量可能不相同,这将使您的scipy.UnivariateSpline崩溃。一个简单的解决方法是仅在path文件被定义的情况下更新stamp列表(这样,它的元素数总是与finger相同)。

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

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

相关问题 更多 >

    热门问题