[英]multiple plots in one figure matplotlib python signal.welch
我尝试在一个图中为每列('AFp1'、'AFp2'、'F9')绘制 plot 3 个图,其中 x 轴为“freqs”,y 轴为“psd”。 我正在寻找一种通过变量的循环,因为最后我想在一个图中 plot >50 个图。
在这里,我找到了一个似乎可以做我想做的事情但我没有让它工作的代码:
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
非常感谢,安吉丽卡
Shoaib 的回答终于奏效了。 非常感谢:“你应该只使用plt.show()
一次,所以把它放在 for 循环之外。你的错误是因为 data 是一个数组,但你把它用作 function 之类的data(something)
。你应该看看什么是数据的维度,然后尝试 select 列或值使用data[ something ]
而不是data( something
). 使用print(data)
或print(data[0])
或print(len(data))
等代码检查数据的维度或print(len(data[0]))
等,它将帮助您调试代码“
这里是你如何 plot 三个函数在一个图中
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 列,那么你可以将每一列分开,然后 plot 它们
for row in data:
x.append( row[0] )
Y1.append( row[1] )
Y2.append( row[2] )
Y3.append( row[3] )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.