質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1361閲覧

位置と物理量を結び付けた3次元配列を3次元の流線図にしたい

Kimi.S

総合スコア7

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/17 16:47

前提・実現したいこと

x、y、zのような位置と物理量を持った3次元のデータ配列を結び付けて流線図を作りたいです。
イメージとしてはhttps://jupiter.geo.kyushu-u.ac.jp/machida/research.htmlのような図です。
データは円筒座標系になっていて、今、円筒座標を直交座標に変換し物理量の配列と結びつけることはできています。

現状できていること

動系方向のベクトルの要素を、data_r
方位角方向のベクトルの要素を、data_theta
鉛直方向のベクトルの要素を、data_z
という3次元配列でそれぞれ出力されます。
そして、座標の一次元配列をr,theta,zとして出力されています。

python

1 theta_matrix, z_matrix, radius_matrix = np.meshgrid(theta, z, r) 2 x = radius_matrix * np.cos(theta_matrix) 3 y = radius_matrix * np.sin(theta_matrix) 4 z = z_matrix 5 u =data_r*np.cos(theta_matrix)-data_theta*np.sin(theta_matrix) 6 v =data_r*np.sin(theta_matrix)+data_theta*np.cos(theta_matrix) 7 w =data3[:,:,:]

このように位置(x,y,z)とそこのベクトル(u,v,w)を結びつけることはできています。
また、これを3次元のベクトル図にすることもできています。

python

1fig = plt.figure() 2ax = fig.gca(projection='3d') 3ax.set_xlabel("X") 4ax.set_ylabel("Y") 5ax.set_zlabel("Z") 6ax.quiver(x[::10,:,::5], y[::10,:,::5], z[::10,:,::5], u[::10,:,::5], v[::10,:,::5], w[::10,:,::5], length=1, normalize=True) 7plt.show()

イメージ説明
しかし、ここから流線図にする方法が分からず困っております。

試したこと

plotlyを使うと良いらしく試してみたのですがうまく使えませんでした。ソースコードでcsvファイルになっているところをどう自分の場合に落とし込めば良いのかがわかりませんでした。

補足情報(FW/ツールのバージョンなど)

python3.7.5

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あなたのコードでは、x,y,z,u,v,wの配列はそれぞれnp.meshgridをもとに定義されているので、これらはすべて3次元の配列になっています。

実際、x,y,z,u,v,wはそれぞれ3次元空間上の各格子点におけるx座標、y座標、z座標、ベクトル場のx成分、ベクトル場のy座標、ベクトル場のz座標を表す配列になっていると思います。

matplotlibでプロットする場合ではこのデータフォーマットでよいのですが、参照されているサイトを見る限り、plotlyというツールではこのフォーマットではダメなようです。
plotlyでは、x,y,z,u,v,wはそれぞれ一次元の配列になっています。

具体的には、持っているベクトル場のデータ点の数をNとすると、N行×6列の表があり各列がそれぞれx座標、y座標、z座標、ベクトル場のx成分、ベクトル場のy座標、ベクトル場のz座標を表しています。
以下にその表の例を示しておきます。(N=3の場合)

xyzuvw
0001.12.0-0.3
0011.22.1-0.2
0112.2-0.11.2

つまりplotlyを用いる場合はx,y,z,u,v,wのそれぞれがこの表の各列になる1次元配列にならないといけないようです。
なので、あなたが持っているベクトル場のデータが、x=1,2,...L_x, y=1,2,...L_y, z=1,2,...L_zの座標上にあるなら、(L_xL_yL_z)行×6列の表を作り、各行にそのデータ点の座標とベクトル場の成分を入力したあとに、表の各列を取り出しplotlyをつかってプロットすればよいでしょう。

ちなみにもしx,y,z,u,v,wを今のデータフォーマット(3次元配列)のまま使いたいのであれば、mayaviというツールが同じくpythonで使えます。
興味があればmayaviのmayavi.mlab.flow()を使ってみましょう。
参考になれば幸いです。

投稿2020/01/20 00:49

tkymtmt

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問