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

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

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

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

Python

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

Q&A

1回答

7110閲覧

matplolib:三次元のデータを補間してプロットを行いたい

astromelt0416

総合スコア15

Matplotlib

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

Python

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

0グッド

1クリップ

投稿2020/08/31 03:18

編集2020/09/01 01:56

前提

以下のような三次元のデータセット(座標x,座標y,座標z,値w)があります。
(2020/09/01:データセットをテスト用に変更しました。)

test2

1 1.0000000000000000 1.0000000000000000 1.0000000000000000 -0.13158839827673241 2 2.0000000000000000 1.0000000000000000 1.0000000000000000 0.71925334812124575 3 3.0000000000000000 1.0000000000000000 1.0000000000000000 0.78471142747083489 4 1.0000000000000000 2.0000000000000000 1.0000000000000000 0.80090268277584165 5 2.0000000000000000 2.0000000000000000 1.0000000000000000 0.47791159839320740 6 3.0000000000000000 2.0000000000000000 1.0000000000000000 -0.66020035502971153 7 1.0000000000000000 3.0000000000000000 1.0000000000000000 0.59567696265775649 8 2.0000000000000000 3.0000000000000000 1.0000000000000000 0.63414183529888790 9 3.0000000000000000 3.0000000000000000 1.0000000000000000 -0.76203127712058638 10 1.0000000000000000 1.0000000000000000 2.0000000000000000 -0.86357330388007059 11 2.0000000000000000 1.0000000000000000 2.0000000000000000 -0.77094770683230540 12 3.0000000000000000 1.0000000000000000 2.0000000000000000 -0.38407329315880157 13 1.0000000000000000 2.0000000000000000 2.0000000000000000 -0.77643663058440127 14 2.0000000000000000 2.0000000000000000 2.0000000000000000 0.29485883547339098 15 3.0000000000000000 2.0000000000000000 2.0000000000000000 -0.90345817476125856 16 1.0000000000000000 3.0000000000000000 2.0000000000000000 0.11249311806459295 17 2.0000000000000000 3.0000000000000000 2.0000000000000000 -0.69983754858836478 18 3.0000000000000000 3.0000000000000000 2.0000000000000000 -0.41968109538305576 19 1.0000000000000000 1.0000000000000000 3.0000000000000000 -0.67405952831591942 20 2.0000000000000000 1.0000000000000000 3.0000000000000000 0.17664524847097818 21 3.0000000000000000 1.0000000000000000 3.0000000000000000 0.40055391690706688 22 1.0000000000000000 2.0000000000000000 3.0000000000000000 0.54128168000403831 23 2.0000000000000000 2.0000000000000000 3.0000000000000000 0.13337159555716704 24 3.0000000000000000 2.0000000000000000 3.0000000000000000 0.61191841485256293 25 1.0000000000000000 3.0000000000000000 3.0000000000000000 0.19400358833232989 26 2.0000000000000000 3.0000000000000000 3.0000000000000000 -0.32331996535028329 27 3.0000000000000000 3.0000000000000000 3.0000000000000000 -0.29791180540293261

このデータを三次元プロットを行うことを考えます。プロット自体はscatter()を用いて以下のように行うことができました。コードは以前に質問させていただいた(matplotlib:三次元ベクトル場に着色をしたい)を参考にしています。

python3

1#matplotlib inline 2import matplotlib 3import matplotlib.pyplot as plt 4import numpy as np 5from mpl_toolkits.mplot3d import axes3d 6from scipy import interpolate 7 8 9plt.style.use('ggplot') 10plt.rcParams["axes.facecolor"] = 'white' 11fig = plt.figure() 12ax = fig.gca(projection='3d') 13cm = matplotlib.cm.viridis 14 15x = [] 16y = [] 17z = [] 18w = [] 19 20f = open('test2.d') 21for line in f: 22 data = line.split() 23 x.append(float(data[0])) 24 y.append(float(data[1])) 25 z.append(float(data[2])) 26 w.append(float(data[3])) 27f.close() 28 29 30 31ax.set(xlabel='x',ylabel='y',zlabel='z') 32ax.scatter(x, y, z, color=cm(0.5*np.array(w)+0.5),s=150,marker='o',alpha=1.0) 33plt.savefig('vector_3d.png' , dpi = 120) 34plt.show()

結果は以下のようになります。
イメージ説明

###実現したいこと
xyz空間中にある各点の値どうしを補間してプロットを行いたいと考えています。
このとき補間はなるべく細かく行い、できるだけ連続した面に見えるように行いたいです。

###調べたこと
二次元系に対してはPython : 2d contour plot from 3 lists : x, y and rho?などのようにscipy.interpolateを行えばできそうです。これと同じようなことを今回のような3次元の系に対しても行いたいです。

詳しい方がいらっしゃればよろしくお願いします

###追記
具体的には以下のようなイメージです。
写真のように、補間を各面上にある点に対して行う(下の画像中の黒の点を追加する、実際の色は値wで補間しているためグラデーションになるはずです。)ことで、連続な一つの面に見ることができます。
これと同じ操作を他の5面に対しても行うことで、外側から見た分には値wで連続した面が見えるようになるかと思います。今回は内部の点に関しては補間を適用していただかなくて大丈夫です。

イメージ説明

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

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

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

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

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

can110

2020/08/31 09:27

どのようなプロット結果、イメージが欲しいのかを手書きで良いので提示すると回答得られやすくなるかと思います。
astromelt0416

2020/09/01 01:57

アドバイスありがとうございます、内容の方を追加しました。
guest

回答1

0

このデータは本番用ですか?
一応やってみましたが、データのzがランダムすぎてちゃんと面がとれてないような…

python3

1import io 2import matplotlib.pyplot as plt 3from matplotlib.cm import viridis 4import numpy as np 5from scipy.interpolate import griddata 6from mpl_toolkits.mplot3d import Axes3D 7cm = viridis 8 9x = [] 10y = [] 11z = [] 12w = [] 13 14f = io.StringIO(test) # 便宜上、データをstrで与えています 15for line in f: 16 data = line.split() 17 x.append(float(data[0])) 18 y.append(float(data[1])) 19 z.append(float(data[2])) 20 w.append(float(data[3])) 21f.close() 22 23 24x = np.array(x) 25y = np.array(y) 26z = np.array(z) 27 28xi = np.linspace(min(x), max(x),100) 29yi = np.linspace(min(y), max(y),100) 30grid_x, grid_y = np.meshgrid(xi, yi) 31xy = np.array([[X,Y] for X,Y in zip(x,y)]) 32Z = griddata(xy, z, (grid_x, grid_y),method="nearest") 33 34fig = plt.figure() 35ax = Axes3D(fig) 36ax.plot_surface(grid_x, grid_y, Z, cmap = "winter") 37ax.scatter(x, y, z, color=cm(0.5*np.array(w)+0.5),s=150,marker='o',alpha=1.0) 38plt.savefig('vector_3d.png' , dpi = 120) 39plt.show() 40

3d

投稿2020/09/01 00:41

jeanbiego

総合スコア3966

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

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

astromelt0416

2020/09/01 01:59

回答ありがとうございます。 データセットが生データからの抜粋だったので、わかりにくいデータになってしまっていました。 申し訳ございません。 質問の方でデータセットの更新及び追記欄に詳細を書きましたので、見ていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問