scatterを使ってX-Y平面図上でX、Yの位置を指定し、その指定した位置に、強度を表す数値を色で表したいのですが・・・
14 views (last 30 days)
Show older comments
Takeru Katagiri
on 22 Aug 2019
Commented: Takeru Katagiri
on 26 Aug 2019
scatterを使ってX-Y平面図上でX、Yの位置を指定し、その指定した位置に、強度を表す数値を色で表したいのですが、エクセルデータをうまく出力してくれません。
持っているデータはX位置におけるY位置で、X座標に対して、Y座標が細かくずれていきます。
イメージはXが0.1mmの時、Yが0.001mm刻み(実際にはYは関数ではなく、測定値で、刻み幅がバラバラの数値になります)に変化していき、
そのXとYの指定した座標位置にXとYの座標に全く関係ない、別途で計算した、強度の値を色の変化する点で示したいのです。
三つの引数があり、二次元の図面で表したいのでscatterが良いのかなとおもってやってみるのですが、
エクセルデータをうまく読み込んでくれません。
データ入院してついては
Xは7500行 1列
Yは7500行 100列
kyoudoは7500行 100列 のデータになっていてdoubleにして入力しています。
scatter(X,Y,kyoudo,filled)
を入れると、コメントで
XとYは同じベクトルの長さでなくてはなりません と表示されます。
自分は初心者でどうしたら良いかわからず、困っています。解決方法の検討がつく方がいれば、ぜひ助けてほしいです。
また、できることのら、scatteredInterpolantやimagescでも同じエクセルファイルを用いて出力できるようなりたいです。
別の方法でも大丈夫なので、なにか良い手法を教えていただくことはできませんか。
よろしくお願いいたします。
0 Comments
Accepted Answer
Kazuya
on 24 Aug 2019
Edited: michio
on 25 Aug 2019
ちょっと美しくないですがやってみました。結果としては・・
こんな感じ。
散布データを内挿して等高線図を描くとどうも綺麗に描けなかったので、散布データを三角形の集合として取り扱い、それぞれの三角形に色を付ける方法を取りました。コードのほとんどが散布データを無理やり三角形の集合として(強度も含め)まとめなおすことに費やされています。
もしもともと FEM の結果であれば各要素の情報(座標点・連結・強度)として出力していればもう少し処理は楽かもしれません。
さらに言うと、もう PDE Toolbox を使って強度計算しちゃえばもっと楽です。
https://jp.mathworks.com/products/pde.html
以下コードです。
頂戴したデータはさらにデータ点数削減して、mat ファイルに纏めました(添付しています)。
Excelファイルからの読み込み方はとりあえずおいておいて、まずは描画に集中します。
% 各点で三角形を作り patch オブジェクトとして色を付ける方法を試します。
% データロード
% X : 1001x1 double
% Y : 1001x327 double
% Strength : 1001x327 double
load data_small.mat
% X座標点をYと同じサイズの行列にします。
XX = repmat(X,1,327);
% FEM の結果(?)ですし、各点からドローネ三角形分割します。
DT = delaunayTriangulation(XX(:),Y(:));
% ドローネ三角形分割の情報と Strength (色)情報を
% 結合するために table 型変数を活用します。
dataTable = table([XX(:),Y(:)],Strength(:),...
'VariableNames',{'Points','Strength'});
% 重複している点があるので削除します。
dataTable = unique(dataTable);
% ドローネ三角形分割の座標点情報
triTable = table(DT.Points,'VariableNames',{'Points'});
% ドローネ三角形分割の座標点と一致する位置にある
% 元データの Strength を検索して結合
triColorTable = join(triTable,dataTable,'Keys','Points');
% それぞれの三角形を patch オブジェクトして描画
% 各三角形の頂点に色を指定し、patch の面は各頂点の色
% から内挿するよう設定('interp')
patch('Faces',DT.ConnectivityList,...
'Vertices',DT.Points,...
'EdgeColor','none','FaceColor','interp',...
'CData',triColorTable.Strength);
More Answers (2)
Kazuya
on 22 Aug 2019
「scatter」と「強度を表す数値を色で表したい」がうまくイメージできないんですが、、
scatter(x,y,sz)
の構文ということは、、各xy座標において、強度に応じた色の点を描く感じでしょうか。それであば
X100 = repmat(X, 1, 100);
scatter(X100(:),Y(:),kyoudo(:),'filled')
でとりあえず何かしら描けるかと思いますが、強度を色の関係はどうしましょう。。
ちなみに X100 は X を横方向に 100 回コピーした行列で 7500 x 100 になっていて、Yと同じサイズになっているはず。
そして X100(:) や Y(:) は行列をベクトル(1列)のデータとして取り扱うコマンドです。X100, Y, kyoudo をそれぞれ1列のベクトルとして scatter 関数に入れています。
以下で確認してみてください。
X = [1,2,3; 4,5,6; 7,8,9]
X(:)
X =
1 2 3
4 5 6
7 8 9
ans =
1
4
7
2
5
8
3
6
9
もし他に以下から想像されているのと近いものがあれば教えてくださいませ。
0 Comments
Takeru Katagiri
on 22 Aug 2019
See Also
Categories
Find more on Delaunay 三角形分割 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!