csvデータを複数重​ねてグラフ化し、値に​よって色分けする方法​について

23 views (last 30 days)
cho hunseki
cho hunseki on 24 Dec 2022
Commented: cho hunseki on 26 Dec 2022
度々質問させて頂いています。
現在csvデータを複数重ねてグラフ化しております。
具体的には
list = dir('*.csv');
figure
hold on
for ii = 1:length(list)
a = readmatrix(list(ii).name);
 A = a.*1e6;
plot(A(1,:),'b');
end
上記コードで添付のfigure1のグラフが出来ます。
X軸の単位は「ms」、Y軸の単位は「μV」です。
次にY軸の値に応じてグラフの色分けを試みました。
Y軸の値で(最大値)-(最小値) < 100 μVになる波形だけを赤にしようとし、
関数peak2peakを使用しました。
(例:最大値+50μV、最小値-30μV→80μV)
list = dir('*.csv');
figure
hold on
for ii = 1:length(list)
a = readmatrix(list(ii).name);
A = a.*1e6;
if peak2peak(A) < 100;
color = 'red';
else
color = 'blue';
end
plot(A(1,:),color);
end
上記コードでグラフ化すると、添付のfigure2にようになりました。
figure2をみると、(最大値)-(最小値) < 100 μV が赤になっているわけではなさそうです。
以下を教授頂きたいです。
①peak2peakの使い方がおかしいでしょうか。他の関数が適しているでしょうか。
②また、X軸0ms~300msの範囲内でなどと、X軸の範囲を指定する条件を追加することなどは可能でしょうか。
ご検討頂けると幸いです。
宜しくお願い致します。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 24 Dec 2022
Edited: Atsushi Ueno on 24 Dec 2022
①peak2peakの使い方がおかしいでしょうか⇒おそらくYES
 他の関数が適しているでしょうか⇒NO(peak2peak関数でOK)
peak2peak関数を意図しない形で使っていると予想します。
CSVファイルはN行M列(Nは測定チャネル数、Mはサンプリング数)で、各CSVファイルの最初の1ch分だけプロットしていると想定します。plot(A(1,:),color)がその根拠です。
その場合、peak2peak関数に入力する行列を意図する向きに転置するか、dim — 動作する対象の次元を意図する方向に合わせる必要があります。dim — 動作する対象の次元を省略した場合、ベクトルの場合は自動認識してくれますが、行列の場合は自動認識してくれません。下記の事例で、peak2peak関数に何を入力すれば意図した結果が得られるか解ると思います。
A = sin(2*pi*[0.1;0.2]*(0:0.1:100)) % サンプルデータ:2行40列のベクトル。各行のp-p値を得たい
A = 2×1001
0 0.0628 0.1253 0.1874 0.2487 0.3090 0.3681 0.4258 0.4818 0.5358 0.5878 0.6374 0.6845 0.7290 0.7705 0.8090 0.8443 0.8763 0.9048 0.9298 0.9511 0.9686 0.9823 0.9921 0.9980 1.0000 0.9980 0.9921 0.9823 0.9686 0 0.1253 0.2487 0.3681 0.4818 0.5878 0.6845 0.7705 0.8443 0.9048 0.9511 0.9823 0.9980 0.9980 0.9823 0.9511 0.9048 0.8443 0.7705 0.6845 0.5878 0.4818 0.3681 0.2487 0.1253 0.0000 -0.1253 -0.2487 -0.3681 -0.4818
peak2peak(A') % 転置して入力(各列のp-p値を得たい)⇒意図した結果になる
ans = 1×2
2.0000 1.9961
peak2peak(A) % 意図しない結果(各列のp-p値が得られてしまう)
ans = 1×1001
0 0.0625 0.1234 0.1807 0.2331 0.2788 0.3164 0.3447 0.3626 0.3690 0.3633 0.3449 0.3135 0.2691 0.2118 0.1420 0.0605 0.0320 0.1343 0.2452 0.3633 0.4868 0.6142 0.7434 0.8727 1.0000 1.1234 1.2408 1.3504 1.4503
peak2peak(A,2) % dimで演算方向を指定⇒意図した結果になる
ans = 2×1
2.0000 1.9961
peak2peak(A(1,:)) % 初めからベクトルデータに絞る⇒dimを指定しなくても自動認識により意図した結果になる
ans = 2
②また、X軸0ms~300msの範囲内でなどと、X軸の範囲を指定する条件を追加することなどは可能でしょうか。
はい。peak2peak関数に入力する行列データの範囲をインデックスで絞れば可能です。
start = 1; % 1は適当な値。ここに0[ms]のインデックス値を入力する必要がある
stop = 2; % 1は適当な値。ここに300[ms]のインデックス値を入力する必要がある
if peak2peak(A(1,start:stop)) < 100
%省略
end
(追記)
peak2peak関数の出力が意図しないサイズならば、その後の処理でエラーが出るのでは」と考えるのが自然ですが、MATLABの持つ柔軟さが故にそうはなりません。具体的に言うと:下記の箇所で、peak2peak関数の出力はスカラではないと想定しますが、
if peak2peak(A) < 100
その場合、if文にも複数の値が渡され、全条件が真で揃わないと真判定になりません。
[0 100 200] < 100
ans = 1×3 logical array
1 0 0
if [0 100 200] < 100 % if文は全条件が真で揃わないと真にならない
disp('真')
else
disp('偽')
end
if [1 2 3] < 100 % if文は全条件が真で揃わないと真にならない
disp('真')
else
disp('偽')
end
これがエラーを出さず、かつ意図しない結果の原因が見えない現象です。
  1 Comment
cho hunseki
cho hunseki on 26 Dec 2022
Atsushi Uenoさん
いつもご教授頂きありがとうございます。
迅速にご回答頂いたにも関わらず、すぐに返信出来ず申し訳ありません。
peak2peakを用いて値に応じてグラフを色分け出来ました。
ありがとうございました。
X軸の範囲指定のインデックス値については、関数findを用いて戦っております。
またご相談させて頂くかもしれません。
宜しくお願い致します。
返信が遅くなり申し訳ありませんでした。

Sign in to comment.

More Answers (0)

Categories

Find more on 2 次元および 3 次元プロット in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!