matlabで単一の Figure での複数(30個)のプロットの表示方法

エクセルデータを高速フーリエ変換したデータを写真のように表示させたいんですが、 グラフに周波数のデータが4個しか表示されません。(添付ファイル参照) 全部で30個表示させたいんですが、最大4個までしか表示できないんでしょうか。 どこを書き換えればいいでしょうか。 プログラムは以下の通りです。
clear all;close all;
fontsize = 10;
labelfontsize = 10;
%%data input
[FileName,PathName,FilterIndex] = uigetfile('C:\Users\b10061\Desktop\実験データ\*.csv','select the file','MultiSelect','on');
cd(PathName);
[a,b] = size(FileName);
az = -66.5;
el = 46;
% nouha = csvread([subject num2str(1) '.csv'],1,0);
for a = 1:b
[nouha,txt,raw] = xlsread(FileName{1,a});
fs =500;
%%10格納
nouha(:,1) = nouha(:,1)/5000;
%%10s切る
for time = 1:length(nouha)/5000/1
nouha_win10{time} = nouha((time-1)*5000+1:time*5000,:);
%%%%%%%%%%%%%fftをやってるところ%%%%%%%%%%%%%%%%%%%
n=length(nouha_win10{time});
y{time} = fft(nouha_win10{time}(:,2),n);
f = (0:n-1)*(fs/n);
power(:,time) = y{time}.*conj(y{time})/n;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
% %
% % power1 = power(
figure()
for i = 1:time
h1 = plot3(ones(201-00,1)*i*1,f(1,01:201),power(01:201,i));
hold on
h2 = plot3(0:time*10:time*10,ones(2,1)*8,ones(2,1)*0,'r');
hold on
h3 = plot3(0:time*10:time*10,ones(2,1)*13,ones(2,1)*0,'r');
hold on
grid on
xlabel('times(s)','fontsize',labelfontsize,'color',[0 0 0])
ylabel('frequency(Hz)','fontsize',labelfontsize,'color',[0 0 0])
zlabel('PSD','fontsize',labelfontsize,'color',[0 0 0])
set(gca,'YDir','rev')
set(gca,'FontSize',fontsize);
view([az,el])
end
xlim([0 30])
ylim([4 20])
zlim([0 1*10^4])
end

1 commentaire

michio
michio le 30 Nov 2017
参照しやすいよう画像を貼り付けておきます

Connectez-vous pour commenter.

 Réponse acceptée

michio
michio le 30 Nov 2017
Modifié(e) : michio le 30 Nov 2017

1 vote

スクリプト実行後に time という変数にはどんな値が入っていますか?
実際に実行できないのであくまで推測ですが、、最後の for ループ
for i = 1:time
h1 = plot3(ones(201-00,1)*i*1,f(1,01:201),power(01:201,i));
(中略)
では i = 1 から i = time まで実行することになっています。time という変数は1つ前のループ変数として使われています。これは意図されたものでしょうか。

6 commentaires

tomo
tomo le 1 Déc 2017
Modifié(e) : tomo le 1 Déc 2017
回答本当にありがとうございます。 スクリプト実行後に変数timeを確認したところ、数値の4が入っていました。 これが原因なんでしょうか? だとすればどうしたら変数timeを30に変更できますか?
time という変数を1つ前のループ変数として使っているのに特に意図はないです。
michio
michio le 1 Déc 2017
Modifié(e) : michio le 1 Déc 2017
for i = 1:time
において time が 4 だと、4回しか描画は実行されません。ただ、問題はこの箇所ではなく確認すべきは
length(nouha)/5000/1
の値かと思います。この計算結果がループの回数を決めているようですが、1つ前のループ(powerを計算する所)がそもそも4回しか回っていないのではないかと推測しています。
for i = 1:time
for i = 1:30
に変更すると何はともあれ30回描画が行われますが、1つ前のループが4回しか計算されていないかと思いますので、お望みの結果にはならないかと思います。
tomo
tomo le 1 Déc 2017
Modifié(e) : tomo le 1 Déc 2017
for i = 1:30
に変更したところ、下のエラーが出てしまいました。
インデックスが行列の次元を超えています。
エラー: nouha (line 59) h1 = plot3(ones(201-00,1)*i*1,f(1,01:201),power(01:201,i));
length(nouha)/5000/1を変更すれば30回計算するようになるということでしょうか?
michio
michio le 1 Déc 2017
それは、4回分のpowerしか計算されていないのが直接の原因です。
for time = 1:length(nouha)/5000/1
 (中略)
end
のループを見るにどうも
length(nouha)/5000/1
の計算結果の回数(おそらく4) だけしか power が計算されないようプログラムが組まれているようですので、プログラムだけから私が提案できることは、残念ながらこれ以上ありません。
length(nouha)/5000/1
の計算意図を再確認し、今一度プログラムを見直してみてください。
tomo
tomo le 1 Déc 2017
Modifié(e) : tomo le 1 Déc 2017
length(nouha)/5000/1
をもう一度確認してみます。 助けていただいて本当にありがとうございました。
michio
michio le 1 Déc 2017
何かあればまた是非投稿してみてください。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur グラフィックス パフォーマンス dans Centre d'aide et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!