scatterを使っ​てX-Y平面図上でX​、Yの位置を指定し、​その指定した位置に、​強度を表す数値を色で​表したいのですが・・​・

8 views (last 30 days)
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でも同じエクセルファイルを用いて出力できるようなりたいです。
別の方法でも大丈夫なので、なにか良い手法を教えていただくことはできませんか。
よろしくお願いいたします。

Accepted Answer

Kazuya
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);
  3 Comments
Takeru Katagiri
Takeru Katagiri on 26 Aug 2019
Kazuyaさま
surfはすごい便利ですね。
でもKazuyaさまは自分でそのsurfと同じ役割を果たすプログラミングを書けてしまうことがすごいことだと思います。
またKazuyaさんが書いてくださったプログラミングのおかげでsurfの中で具体的にどんなことを行っているかをひも解けるようになれます。一つ一つ調べてその意味をつかむにはKazuyaさまの作っていただいたプログラムが最適です。
本当にありがとうございます。また助けていただけると嬉しいです!

Sign in to comment.

More Answers (2)

Kazuya
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
もし他に以下から想像されているのと近いものがあれば教えてくださいませ。

Takeru Katagiri
Takeru Katagiri on 22 Aug 2019
ご回答ありがとうございます。
自分が最終的に作りたいのは
のスクロールして下がってもらい、ソリッドワークスの解析後のような二次元の図面を作りたいと考えています。
これをやるためにはどうしたら良いかを考え、マトラボのサイトの
の マーカーで塗りつぶす
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);
sz = 25;
c = linspace(1,10,length(x));
scatter(x,y,sz,c,'filled')
のように、色の変化で強度(測定値)を表せないかと考えました。
わかりにくい説明で申し訳ありません。何かいい方法はありませんか。
imagesc等でもできるかもと思っているのですが、なかなかうまく3つの引数を読み込ませられません。
お知恵を貸してはいただけませんか。よろしくお願いします。
  4 Comments
Kazuya
Kazuya on 24 Aug 2019
データありがとうございます。いくつか試してみたので別に回答として投稿しますね。
MATLABをどうやって勉強するか・・は難しい質問ですね。既に実施されているように経験を通して知識が増えていったというのは私も同じでして。。
こんな質問もあります。
他の人の質問に答えるというのは時間は掛かりますがいい練習になります。

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!