CSVデータで時系列を反映させてフィギュア化させる方法について
11 views (last 30 days)
Show older comments
度々質問させて頂いております。ご教授頂けると幸いです。
現在csvデータの生体信号をグラフにすることを試みております。
まず(おそらく時間情報をもっているはずの)生体信号を単発で再現すると、添付のfigure1のようになります。
X軸の単位が「ms」、Y軸の単位が「μV」です。
これを複数個連結させると、添付のfigure 2のようになります。
figure 2を作成した際のcodeは以下のようになります。
files = dir("*.csv");
X = [];
for ii = 1:length(files)
tmp = readmatrix(files(ii).name);
TMP = tmp.*1e6;
X = [X,TMP];
Y = X(1,:);
end
Fs = 1000;
tind = [1:length(Y)]/Fs;
figure(1); plot(tind,Y);
上記codeで複数の生体信号を連結させることは可能ですが、
1つ1つの生体信号には時間軸が含まれております。
例えば、11時10分のデータ、11時40分のデータ、12時5分のデータなど
X軸を上記の「生体信号が得られた時間」に変更し、X軸上で連結させることは可能でしょうか。
(生体信号が得られた時間を反映させた場合、連結というよりはX軸でとびとびになった状態で繋げていくというイメージです)
figure2では1つの生体信号が1000msであり、4つ連結されているので4sとなっております。
timetableという関数を用いて連結させると思うのですが、思うように再現できません。
以下をご教授頂ければ幸いです。
1:関数timetableでよろしいでしょうか。その場合具体的にどのようにcode作成すればよろしいでしょうか。
2:そもそもcsvデータに「生体信号が得られた時間」が組み込まれていないのでしょうか。おそらく入っているはずと認識しているのですが、調べる方法はあるのでしょうか。実際のサンプルデータを添付しております。(例:a_110247→11時2分47秒に得られたデータと認識しております。これはファイル名ですが、この時間がcsvデータにも反映されているはずと認識しております)
宜しくお願い致します。
0 Comments
Accepted Answer
Atsushi Ueno
on 12 Jan 2023
Edited: Atsushi Ueno
on 12 Jan 2023
a = readmatrix("https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1260515/a_110247.csv");
b = readmatrix("https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1260520/b_114558.csv");
c = readmatrix("https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1260525/c_114818.csv");
d = readmatrix("https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1260530/d_115603.csv");
writematrix(a,"a_110247.csv");
writematrix(b,"b_114558.csv");
writematrix(c,"c_114818.csv");
writematrix(d,"d_115603.csv"); % ここまでは気にしないでください。データをローカルにコピーしてます。
>1:関数timetableでよろしいでしょうか。
> その場合具体的にどのようにcode作成すればよろしいでしょうか。
下記にcodeを追記しました。データ長が1024列あったので1000列に揃えました。timetable変換の際、Yを行ベクトル⇒列ベクトルに転置する必要があります。Yに’(アポストロフィ)を付けたのはその為です。時刻情報の文字列を抜き出す為に regexp 関数を使いました。時刻情報を扱う為に duration 関数を、timetableを扱う為に array2timetable 関数を使いました。
2:そもそもcsvデータに「生体信号が得られた時間」が組み込まれていないのでしょうか。おそらく入っているはずと認識しているのですが、調べる方法はあるのでしょうか。
⇒わかりません。それは、そのcsvデータをどの様な方法で取得しているのかを知らない限り答えようがありませんよ。とりあえず、ファイル名に含まれる6桁の数字を「生体信号が得られた時刻」とし、1[ms]刻みで1秒間分のデータとして扱いました。
files = dir("*.csv");
X = [];
tind = [];
for ii = 1:length(files)
tmp = readmatrix(files(ii).name);
TMP = tmp.*1e6;
X = [X,TMP(:,1:1000)]; % 生体信号は1024列ある⇒1000列までにする(1001列~1024列の値は0)
t = regexp(files(ii).name,'\d{2}','match'); % ファイル名から数字6桁を抜き出す
dura = duration(str2num(t{1}),str2num(t{2}),str2num(t{3}),0:999); % 1ms刻みで1秒分(1000列)
tind = [tind,dura]; % 時刻情報も生体信号と同様につなげていく
end
Y = X(1,:); % ここはforループの外に出すべき
%Fs = 1000; tind = [1:length(Y)]/Fs;
TT = array2timetable(Y','RowTimes',tind,'VariableNames',{'biosignal'}) % timetable作成
figure(1); plot(TT,'biosignal'); % 従来通りplot(tind,Y);でもプロット可
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!