问题描述
我尝试在一个图中为每列('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()
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()