【问题标题】:multiple plots in one figure matplotlib python signal.welch一个图中的多个图matplotlib python signal.welch
【发布时间】:2021-01-30 23:08:30
【问题描述】:

我尝试在一个图中为每列('AFp1'、'AFp2'、'F9')绘制 3 个图,x 轴为“freqs”,y 轴为“psd”。我正在寻找一种通过变量的循环,因为最后我想在一个图中绘制 >50 个图。

Here我找到了一个代码,似乎可以做我想做的事,但我没有让它工作:

num_plots = 20

colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))

x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

这是我尝试在我的 for 循环中包含此代码的方式:

path = r'C:/M'
for fil in os.listdir(path):
    #extract SUBJECT name
    r = (fil.split(" ")[0])
    #load file in pandas dataframe
    data = pd.read_csv(path+f'{r} task.txt',sep=",",usecols= 'AFp1','AFp2','F9'])
    data.columns = ['AFp1','AFp2','F9']
    
   num_plots = 3
    for columns in data(1, num_plots + 1):
        freqs, psd = signal.welch(data[columns], fs=500,
                                  window='hanning',nperseg=1000, noverlap=500, scaling='density', average='mean')
        
        colormap = plt.cm.gist_ncar
        plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
        
        plt.plot(freqs, psd)
        plt.legend(columns, ncol=4, loc='upper center', 
                   bbox_to_anchor=[0.5, 1.1], 
                   columnspacing=1.0, labelspacing=0.0,
                   handletextpad=0.0, handlelength=1.5,
                   fancybox=True, shadow=True)
        plt.title(f'PSD for {r}')#, nperseg=1000, noverlap=500
        plt.xlabel('Frequency [Hz]')
        plt.ylabel('Power [V**2/Hz]')
        plt.axis([0,50, -1, 5])
               
        plt.show()

我收到以下错误:

   for columns in data(1, num_plots + 1):

TypeError: 'DataFrame' object is not callable 

如果有人能告诉我如何让它工作,那就太好了:D

非常感谢, 安吉丽卡

【问题讨论】:

  • 一个可复制的例子会很棒
  • 嗨,Rafael,我编辑了我的问题。我认为现在更精确。我不确定你所说的“可重现的例子”是什么意思。如果您需要更多信息,请告诉我。非常感谢!!!

标签: python matplotlib scipy


【解决方案1】:

Shoaib 的回答终于奏效了。非常感谢: “你应该只使用一次plt.show(),所以把它放在for循环之外。你的错误是因为数据是一个数组,但你把它用作像data(something)这样的函数。你应该看看数据的维度是什么,然后尝试使用data[ something ] 而不是data( something 选择列或值。使用print(data)print(data[0])print(len(data))print(len(data[0])) 等代码检查数据的维度。它将帮助您调试代码“

【讨论】:

    【解决方案2】:

    这是您如何在图中绘制三个函数

    import matplotlib.pyplot as plt
    from math import *
    
    x_lim = 6
    n = 1000
    X = []
    Y1 = []
    Y2 = []
    Y3 = []
    for i in range(n):
        x = x_lim * (i/n-1)
        y1 = sin(x)
        y2 = cos(x)
        y3 = x**2
        X.append( x )
        Y1.append( y1 )
        Y2.append( y2 )
        Y3.append( y3 )
        
    plt.plot(X,Y1)
    plt.plot(X,Y2)
    plt.plot(X,Y3)
    plt.title("title")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()
    

    您的问题不可重现,因为您从中获取数据的文件不是必需的。因此我们无法通过复制粘贴您的代码来重现您的错误。但是如果您有一个名为 data 的数组,例如 4 列,那么您可以将每列分开然后绘制它们

    for row in data:
        x.append( row[0] )
        Y1.append( row[1] )
        Y2.append( row[2] )
        Y3.append( row[3] )
    

    【讨论】:

    • 您好 Shoaib,非常感谢您的回复。我修改了我的帖子,试图让我的问题更清楚。我正在寻找一种通过变量 AFp1、AFp2 和 F9 循环的代码,而不是为每个变量添加一行;最后,我想在一个图中使用 >50 个变量。
    • 你应该只使用一次plt.show(),所以把它放在for循环之外。您的错误是因为data 是一个数组,但您将它用作data(something) 之类的函数。您应该看到data 的维度是多少,然后尝试使用data[ something ] 而不是data( something ) 选择列或值。使用print(data)print(data[0])print(len(data))print(len(data[0]))等代码检查data的尺寸。它将帮助您调试代码
    • 就是这样!!!非常感谢Shoaib!!!很遗憾,我想我无法将您的回复标记为正确答案!
    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多