Borrar filtros
Borrar filtros

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

25 visualizaciones (últimos 30 días)
cho hunseki
cho hunseki el 24 de Dic. de 2022
Comentada: cho hunseki el 26 de Dic. de 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軸の範囲を指定する条件を追加することなどは可能でしょうか。
ご検討頂けると幸いです。
宜しくお願い致します。

Respuesta aceptada

Atsushi Ueno
Atsushi Ueno el 24 de Dic. de 2022
Editada: Atsushi Ueno el 24 de Dic. de 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 comentario
cho hunseki
cho hunseki el 26 de Dic. de 2022
Atsushi Uenoさん
いつもご教授頂きありがとうございます。
迅速にご回答頂いたにも関わらず、すぐに返信出来ず申し訳ありません。
peak2peakを用いて値に応じてグラフを色分け出来ました。
ありがとうございました。
X軸の範囲指定のインデックス値については、関数findを用いて戦っております。
またご相談させて頂くかもしれません。
宜しくお願い致します。
返信が遅くなり申し訳ありませんでした。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre 2 次元および 3 次元プロット en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!