前提・実現したいこと
以下のように、各行に(x座標 y座標 z座標 u v w)となっているデータファイルがあります。
1.000 1.000 1.000 0.4348 -0.4661 -0.770
2.000 2.000 2.000 -0.3613 0.2414 0.9006
3.000 3.000 3.000 0.55511 0.4136 0.7216
matplotlibを用いてこのデータの3次元ベクトル場をプロットします。(ここまではできました。)
また各ベクトルはwの値を用いて、w=-1のとき青、w=1のとき赤となるようなグラデーションで彩色を行いたいと考えているのですが、この彩色の部分ができず困っています。
やったこと
このデータをベクトル場としてプロットするにはmatplotlibでquiverを使うと便利であると以下のサイト様で学びました。
[matplotlib 3D] 13. 3Dグラフでベクトル
このサイトをもとにかいたソースコードが以下になります。
python
1 2import matplotlib.pyplot as plt 3import numpy as np 4from mpl_toolkits.mplot3d import axes3d 5 6plt.style.use('ggplot') 7plt.rcParams["axes.facecolor"] = 'white' 8fig = plt.figure() 9ax = fig.gca(projection='3d') 10 11x = [] 12y = [] 13z = [] 14u = [] 15v = [] 16w = [] 17 18f = open('test.d') 19for line in f: 20 data = line.split() 21 x.append(float(data[0])) 22 y.append(float(data[1])) 23 z.append(float(data[2])) 24 #プロットの都合でサイズを調節 /2.5 25 u.append(float(data[3])/2.5) 26 v.append(float(data[4])/2.5) 27 w.append(float(data[5])/2.5) 28f.close() 29 30ax.set(xlabel='x',ylabel='y',zlabel='z') 31ax.quiver(x, y, z, u, v, w) 32plt.savefig('test.png' , dpi = 120) 33plt.show()
調べたこと
2次元のベクトル場に対しては、matplotlib.axes.Axes.quiver
にもありますように、quiver(X, Y, U, V, [C])と引数Cを取ればいいとのことですが、3次元ではどのようにすればいいかわからない状態です。私の調査不足かもしれませんが、ご存知の方がいれば教えていただきたいです。
###追記
can110様、回答ありがとうございます。
以下のようにカラーマップを導入してみました。
python
1import matplotlib 2import matplotlib.pyplot as plt 3import numpy as np 4from mpl_toolkits.mplot3d import axes3d 5 6plt.style.use('ggplot') 7plt.rcParams["axes.facecolor"] = 'white' 8fig = plt.figure() 9ax = fig.gca(projection='3d') 10cm = matplotlib.cm.seismic 11 12x = [] 13y = [] 14z = [] 15u = [] 16v = [] 17w = [] 18 19f = open('test.d') 20for line in f: 21 data = line.split() 22 x.append(float(data[0])) 23 y.append(float(data[1])) 24 z.append(float(data[2])) 25 #プロットの都合でサイズを調節 /2.5 26 u.append(float(data[3])/2.5) 27 v.append(float(data[4])/2.5) 28 w.append(float(data[5])/2.5) 29f.close() 30 31ax.set(xlabel='x',ylabel='y',zlabel='z') 32ax.quiver(x, y, z, u, v, w, color=cm(0.5*np.array(w)+0.5) 33plt.savefig('test.png' , dpi = 120) 34plt.show()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/30 12:03
2020/08/30 12:34