MATLAB Answers

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

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

  0 Comments

Sign in to comment.

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 25 Aug 2019
Kazuyaさん
まさか本当にプログラムを作っていただけるとは思いませんでした。
ただただ感謝です。ありがとうございます!
自分の試験データを入れてみてどのようになるかまた報告させていただきます。
もし良ければまた相談にのっていただけると助かります。
本当にありがとうございました。
Kazuya
Kazuya on 25 Aug 2019
こちらの回答の方が簡単ですね。surf でいけたとは・・!
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
もし他に以下から想像されているのと近いものがあれば教えてくださいませ。

  0 Comments

Sign in to comment.


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

Show 1 older comment
Takeru Katagiri
Takeru Katagiri on 23 Aug 2019
Kazuyaさま。ありがとうございます。
自分で作ったサンプルデータを添付させていただきます。本物のデータをお渡しすることができず、大変申し訳ありません。
添付したデータはすごくつまらない値で、セル数も半分くらいなっております。
サンプル1は X位置が行数ごとに微小に変化し、増加していきます。Yは列数が増えていくに連れて1セルあたりの増加量(Xに対する傾き)が大きくなっているだけの値にになります。(非常にわかりにくい文章で申し訳ありません。plot(X,Y)で見ていただければすぐにわかると思います。)
サンプル1XY位置に対する強度 に示すX位置は サンプル1 のファイルと全く同じで、Sの値が強度を表し、各セルに示された数値は サンプル1 のXY位置と対応している数値になります。
(サンプル1XY位置に対する強度 の結果が示すことは、この試験片は測定位置0からX方向の増加方向に1㎜ごとに0.1強度が上昇し、Yの位置に依存しない強度変化をしていることを示しています。実際はXの値 Yの値 Sの値は関数では表せない、バラバラの値を示します)
わかりにくい説明で申し訳ありません。ぜひご対応していただけると助かります。
また別件でお伺いしたいのですが、自分はMATLAB初心者でどのように勉強していったらよいかわかりません。どのように勉強を進めていったらよいかアドバイスをいただけませんか。
本サイトの入門コースの教材を勉強したり、動画による説明を見たりいています。また他の人の作ったプログラムを見て、自分の作りたいものと似ていたら、そのコードを一つ一つ調べて、何を行っているか調べるような勉強方法をとっておりますが、なかなか順調に行かないことばかりで滅入っております。Kazuyaさまはどうやって勉強されましたか?どれくらいで使いこなせるようになるものなんのでしょうか。加えて教えていただけると助かります。
よろしくお願いします。
Takeru Katagiri
Takeru Katagiri on 23 Aug 2019
すいません、データを添付し忘れました。
大変お手数なのですが、データが5MBを越えてしまったデータなのでURLの先でダウンロードしていただけると助かります。
よろしくお願いいたします。
Kazuya
Kazuya on 24 Aug 2019
データありがとうございます。いくつか試してみたので別に回答として投稿しますね。
MATLABをどうやって勉強するか・・は難しい質問ですね。既に実施されているように経験を通して知識が増えていったというのは私も同じでして。。
こんな質問もあります。
他の人の質問に答えるというのは時間は掛かりますがいい練習になります。

Sign in to comment.

Sign in to answer this question.

Tags