- x軸:データ番号
 - y軸:フォトン数(光子数)
 
x軸の値を表記転換するには?
    3 views (last 30 days)
  
       Show older comments
    
ファイルのデータから日時情報を取り出し、グラフの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 Comments
  Jiro Doke
    
 on 4 Aug 2017
				お手数ですが、もとの質問を上記の正しい質問に書き換えていただけますか?nknknknkさんのアイコンの下に「Edit」というリンクがあるので、そこから修正してください。とりあえず回答は下にしておきます。
Accepted Answer
  Jiro Doke
    
 on 4 Aug 2017
        新しい質問に対して回答します。
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 Comments
  Jiro Doke
    
 on 16 Aug 2017
				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))
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!