csvデータを複数重ねてグラフ化し、値によって色分けする方法について
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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軸の範囲を指定する条件を追加することなどは可能でしょうか。
ご検討頂けると幸いです。
宜しくお願い致します。
0 comentarios
Respuesta aceptada
Atsushi Ueno
el 24 de Dic. de 2022
Editada: Atsushi Ueno
el 24 de Dic. de 2022
①peak2peakの使い方がおかしいでしょうか⇒おそらくYES
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値を得たい
peak2peak(A') % 転置して入力(各列のp-p値を得たい)⇒意図した結果になる
peak2peak(A) % 意図しない結果(各列のp-p値が得られてしまう)
peak2peak(A,2) % dimで演算方向を指定⇒意図した結果になる
peak2peak(A(1,:)) % 初めからベクトルデータに絞る⇒dimを指定しなくても自動認識により意図した結果になる
②また、X軸0ms~300msの範囲内でなどと、X軸の範囲を指定する条件を追加することなどは可能でしょうか。
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
if [0 100 200] < 100 % if文は全条件が真で揃わないと真にならない
disp('真')
else
disp('偽')
end
if [1 2 3] < 100 % if文は全条件が真で揃わないと真にならない
disp('真')
else
disp('偽')
end
これがエラーを出さず、かつ意図しない結果の原因が見えない現象です。
Más respuestas (0)
Ver también
Categorías
Más información sobre 2 次元および 3 次元プロット en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!