カラーマップを作るには?

下記リンク先に表記済みですが、フォルダに1分毎の観測データファイルがあります。
例えば、下記プログラムを実行すると、 2016/10/15/12:30に観測されたデータが x軸:Photoncount,y軸:Attitude[m] のグラフ表示されます(図①)
このフォルダ内の 2016/10/15 21:00-10/16 6:00 のデータを使い、図②のようなカラーマップを作成したいです。
x軸:Time、y軸:Height[m]、カラーバーの値はPhotoncount です。 また、表記の時間間隔:1分,距離分解能:15mです。
どのようなコードになるでしょうか。
急いでおり、丸投げの質問になってしまい大変恐縮ですが、参考によろしくお願い致します。
if true
%ファイル名をフルパスごと取得
DebugFiles = 'C:\Users\ken\Documents\MATLAB\161015\*16A1512.304146'; %期間指定
%指定フォルダ内のファイルをリスト化
D = dir(DebugFiles);
for i=1:length(D)
% ファイルオープン
fid=fopen(D(i).name);
% ヘッダー読み込み
for k = 1:3
headers{k} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = third_header(end); %4
% データセットのヘッダーを読み込み
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); %512
[data{k},count] = fread(fid,num_read,'long');
fread(fid,2,'uint8'); % Read CRLF=13d 10d
end
fclose(fid);
% 行列に整形(各データの数が同じ場合は成功)
DataMat = [data{[4]}]; %[1 3] AnalogOn,Off,[2 4] PhotoncountOn,Off
%0~511までの15刻みのベクトルを作成し、そこから100を引く
x = (0:15:511*15) - 100*15;
plot(x,DataMat)
view(90,-90)   %x軸とy軸反転
hold on
end
title('2016/10/15 12:30')
legend('Photoncount Off')
xlabel('Attitude[m]')
ylabel('Photoncount')
 xlim([0 3000])
ylim([7*10^4 10^5])
end

1 件のコメント

michio
michio 2017 年 8 月 8 日
図を質問内に貼り付けてみました。赤丸で記したボタンで貼り付けられますので、是非活用ください :)

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

 採用された回答

michio
michio 2017 年 8 月 8 日
編集済み: michio 2017 年 8 月 8 日

2 投票

関数としては contourf 関数 で実現できそうな気がしますが、この関数は試してみましたか?
例:
n = 100;
X = linspace(0,10,n);
Y = linspace(0,1,n);
Z = peaks(n);
contourf(X,Y,Z,'LineStyle','none');
colorbar;
上は適当なデータで実際に実行できる形にしていますが、XにTime、YにHeight[m]、そして2次元配列 Z を読み取ったPhotoncountで作成すれば行けると思いますが、いかがでしょう?

8 件のコメント

nknknknk
nknknknk 2017 年 8 月 8 日
編集済み: nknknknk 2017 年 8 月 8 日
はい、contour関数試してみましたが、理解しきませんでした。
XTimeYHeight[m]、そして2次元配列 Z を読み取ったPhotoncountで作成すれば行けると思います
の理解は出来ていますが、実際にどう値を入れるかが理解出来ませんでした。
下記の方法では エラー が出てしまいますが、根本的に間違っているでしょうか。
X = linspace(0,1800,i);
Y = linspace(0,3000,x);
Z = peaks(DataMat);
contourf(X,Y,Z,'LineStyle','none');
colorbar;
michio
michio 2017 年 8 月 8 日
編集済み: michio 2017 年 8 月 9 日
遅くまで奮闘されているんですね。nknknknkさんのコードに合わせてプログラムを作成するのはなかなか大変ですので、ポイントだけお伝えします。
nknknknkさんの場合、contourf 関数に入力する2次元配列 Z は、各列が各時刻における Photoncount に対応するようにまとめると便利かと思います。各時刻における Photocount のデータが Nx1 のベクトルだと仮定すると、横に並べていくイメージでしょうか。M個並べると、最終的に Z は NxM の配列となります。
ここさえ実現できれば、後は
contourf(Z)
との実行でそれらしい図が出るはずですので、まずそこまでがんばってみてください。
nknknknk
nknknknk 2017 年 8 月 8 日
編集済み: nknknknk 2017 年 8 月 8 日
ご回答ありがとうございます。自分の力不足で時間がかかってしまっております..。
2016/10/15 12:41-12:49 の9ファイルを読み込み、 Dataを512×9の配列として、
contourf(Data)
を実行しました。Data配列のデータ中身も確認したところ正常でした。 非効率的なプログラムだと思いますが、以下にプログラムを載せます。 ご確認よろしくお願いします。
%ファイル名をフルパスごと取得
DebugFiles = 'C:\Users\aboken\Documents\MATLAB\161015\*16A1512.4*'; %期間指定
%指定フォルダ内のファイルをリスト化
D = dir(DebugFiles);
for i=1:length(D)
% ファイルオープン
fid=fopen(D(i).name);
% ヘッダー読み込み
for k = 1:3
headers{k} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = third_header(end); %4
% データセットのヘッダーを読み込み
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); %512
[data{k},count] = fread(fid,num_read,'long');
fread(fid,2,'uint8'); % Read CRLF=13d 10d
end
fclose(fid);
if i == 1
Data = data{4};
end
if i >= 2
Data = horzcat(Data,data{4}); %配列を水平連結 [1 3] AnalogOn,Off,[2 4] PhotoncountOn,Off
end
end
michio
michio 2017 年 8 月 9 日
何を確認したらよいのでしょう・・欲しかったプロットができましたか?
nknknknk
nknknknk 2017 年 8 月 9 日
このグラフの意味を掴みかねています。
contours()の説明ページの
x の値は Z の列インデックスに対応し、y の値は Z の行インデックスに対応します。
から、 この図のX軸がTIME、Y軸がデータ番号で、色の変わっている部分は 何を表しているのでしょうか、、。
グラフの
1.X軸に時間を表記
2.  以前質問させていただいた 、Y軸の「データ番号」を「距離」に表記変換
3.フォトンカウント各カラーバーで色を変えて表示
すれば質問2枚目のグラフのようになるということでしょうか。
意味が分からない理解になっていたら申し訳ございません。
Jiro Doke
Jiro Doke 2017 年 8 月 9 日
contour 関数のドキュメンテーションをご覧になられたでしょうか。
>> doc contourf
この関数は等高線図を作成するので同じ色の部分は同じ値を表しています。図を見てみると2色しかないので、二つのレベルにしか分解されていないようですね。
>> contourf(Data, 10)
とかやると等高線のレベルを10階調にできます。
他に試せるコマンドは
>> imagesc([0 1800],[0 3000],Data)
試してみてください。
nknknknk
nknknknk 2017 年 10 月 5 日
ご回答ありがとうございます。
imagesc でのカラーマップ表示をしたかったのですが、 contourf を使用して、x軸観測時刻、y軸観測距離[km]の等高線の図(図①)は作成出来ました。ここで加えて質問ですが、図①の等高線の間に色をつける事は可能でしょうか。
図①
nknknknk
nknknknk 2017 年 10 月 9 日
解決いたしました。 ありがとうございました。

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

その他の回答 (0 件)

カテゴリ

質問済み:

2017 年 8 月 8 日

コメント済み:

2017 年 10 月 9 日

Community Treasure Hunt

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

Start Hunting!