前提
以下のような三次元のデータセット(座標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で連続した面が見えるようになるかと思います。今回は内部の点に関しては補間を適用していただかなくて大丈夫です。