x軸の値を表記転換するには?

12 ビュー (過去 30 日間)
nknknknk
nknknknk 2017 年 8 月 2 日
コメント済み: Jiro Doke 2017 年 8 月 16 日
ファイルのデータから日時情報を取り出し、グラフのx軸に設定するにはどうすれば良いでしょうか?
下記の質問の補足になります。
下記プログラムで、出したグラフを添付します。 ①10/13 0:00-23:59、②2016/10/15 13:00-13:10
このグラフは
x軸がデータ番号となっており、 データ数:512個で、最初の100個は背景光(無視)、 100番目が0[m]になります。
距離分解能は、15[m]なので、
#0~99 Background
#100 0[m]
#101 15[m]
#102 30[m]
....
#200 1500[m]
...
#500 6000[m]
..
#511 6165[m]
end となります。
そこで、 1.x軸について、データ番号から観測距離[m]に表記変換したい。 データ番号を100からスタートさせ、100→0,101→15,102→30 と表記を変更したい。 2.データセットが4つあるうちの、2,4番目のみ取得して、グラフに表示させたい。
の方法をお聞きしたいです。よろしくお願い致します。
if true
% code
end
DebugFiles = 'C:\Users\aboken\Documents\MATLAB\161015\*16A1513.0*';
%指定フォルダ内のファイルをリスト化 日にち指定
D = dir(DebugFiles);
% ファイルオープン
fid=fopen(D(i).name);
% ヘッダー読み込み
for k = 1:3
headers{k} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = 4third_header(end);
% データセットのヘッダーを読み込み
datasetheader = {};
for k = 1:num_datasets
datasetheader{k} = fgetl(fid);
end
fread(fid,2,'uint8') % Read CRLF=13d 10d
% データセットのヘッダーに記載されたデータ分バイナリデータを読み込む
data = {};
for k = 1:num_datasets
dataheader_parsed = sscanf(datasetheader{k},'%d');
num_read = dataheader_parsed(4);
[data{k},cunt] = fread(fid,num_read,'long');
fread(fid,2,'uint8'); % Read CRLF=13d 10d
end
% データファイルのクローズ
fclose(fid);
% 行列に整形(各データの数が同じ場合は成功)
DataMat = [data{:}];
plot(DataMat)
hold on
end
  5 件のコメント
Jiro Doke
Jiro Doke 2017 年 8 月 4 日
お手数ですが、もとの質問を上記の正しい質問に書き換えていただけますか?nknknknkさんのアイコンの下に「Edit」というリンクがあるので、そこから修正してください。とりあえず回答は下にしておきます。
nknknknk
nknknknk 2017 年 8 月 4 日
修正いたしました。 ご忠告ありがとうございます。

サインインしてコメントする。

採用された回答

Jiro Doke
Jiro Doke 2017 年 8 月 4 日
新しい質問に対して回答します。
1. データ番号を100(正確には101 : MATLAB は1から数えるため)から15刻みで表記。
plot コマンドの前にx軸となるベクトルを定義すればできます。
% まず 0 ~ 511 までの 15 刻みのベクトルを作成し、そこから 100 のオフセットをひく
x = (0:15:511*15) - 100*15;
plot(x,DataMat)
2. データセットが 4 つあるうちの、2,4 番目のみ取得して、グラフに表示させたい。
if 構文を使って、2,4番目のみをプロット。1.の回答と合わせると
if (i == 2) || (i == 4) % i が 2 か 4 ならば
% まず 0 ~ 511 までの 15 刻みのベクトルを作成し、そこから 100 のオフセットをひく
x = (0:15:511*15) - 100*15;
plot(x,DataMat)
hold on
end
  11 件のコメント
nknknknk
nknknknk 2017 年 8 月 15 日
ご回答ありがとうございます。 それは試したのですが、
エラー ./
行列の次元は一致しなければなりません。
エラーの発生場所 ReadFile2jou (line 44)
plot(x,DataMat./x.^2)
と同じようにエラーメッセージが出ます。 他にどのようなことが考えられるでしょうか。
Jiro Doke
Jiro Doke 2017 年 8 月 16 日
DataMat がベクトルではなくて行列であるのに気づきませんでした。
そのエラーは割り算や二乗するときは同じ大きさ(行x列)同士でなければならないというエラーです。 DataMat は行列で x はベクトルだからですね。こういう時は大きさが同じになるように複製などして揃えてあげる必要があります。例えば
plot(x,DataMat./(repmat(x(:),1,size(DataMat,2)).^2))
関数 repmat のドキュメントを確認してみてください。もし分かりづらい場合は以下のような簡単な例で試してみてください。
x = 1:5;
DataMat = rand(5,3);
plot(x,DataMat./(repmat(x(:),1,size(DataMat,2)).^2))

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange行列および配列 についてさらに検索

Community Treasure Hunt

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

Start Hunting!