微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个图中的多个图 matplotlib python signal.welch

如何解决一个图中的多个图 matplotlib python signal.welch

我尝试在一个图中为每列('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','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',num_plots))))
        
        plt.plot(freqs,psd)
        plt.legend(columns,shadow=True)
        plt.title(f'PSD for {r}')#,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

非常感谢, 安洁莉卡

解决方法

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

,

这是在图中绘制三个函数的方法

process.env.mode

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。