CSVデータで時系列​を反映させてフィギュ​ア化させる方法につい​て

9 views (last 30 days)
cho hunseki
cho hunseki on 12 Jan 2023
Commented: cho hunseki on 14 Jan 2023
度々質問させて頂いております。ご教授頂けると幸いです。
現在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データにも反映されているはずと認識しております)
宜しくお願い致します。

Accepted Answer

Atsushi Ueno
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でよろしいでしょうか。
はい。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作成
TT = 4000×1 timetable
Time biosignal ________ _________ 11:02:47 -5.188 11:02:47 -14.954 11:02:47 -25.024 11:02:47 -8.5449 11:02:47 7.9346 11:02:47 4.8828 11:02:47 2.1362 11:02:47 1.2207 11:02:47 0.61035 11:02:47 0 11:02:47 -0.61035 11:02:47 0 11:02:47 0.61035 11:02:47 0.61035 11:02:47 0.61035 11:02:47 0.30518
figure(1); plot(TT,'biosignal'); % 従来通りplot(tind,Y);でもプロット可
  1 Comment
cho hunseki
cho hunseki on 14 Jan 2023
Atsushi Uenoさん
いつもご回答頂きありがとうございます。
教えて頂いたcodeを用いてやりたいことが一発で出来ました!
自分では全く思い付きもしない、regexp、durationなどの関数を用いることも勉強になりました。
ありがとうございました。

Sign in to comment.

More Answers (0)

Categories

Find more on データのインポートと解析 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!