質問編集履歴

1 「追記」を追加しました

astromelt0416

astromelt0416 score 15

2020/08/30 21:00  投稿

matplotlib : 三次元ベクトル場に着色をしたい
### 前提・実現したいこと
以下のように、各行に(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グラフでベクトル](https://sabopy.com/py/matplotlib_3d_13/)
このサイトをもとにかいたソースコードが以下になります。
```python
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
plt.style.use('ggplot')
plt.rcParams["axes.facecolor"] = 'white'
fig = plt.figure()
ax = fig.gca(projection='3d')
x = []
y = []
z = []
u = []
v = []
w = []
f = open('test.d')
for line in f:
   data = line.split()
   x.append(float(data[0]))
   y.append(float(data[1]))
   z.append(float(data[2]))
   #プロットの都合でサイズを調節 /2.5
   u.append(float(data[3])/2.5)
   v.append(float(data[4])/2.5)
   w.append(float(data[5])/2.5)
f.close()
ax.set(xlabel='x',ylabel='y',zlabel='z')
ax.quiver(x, y, z, u, v, w)
plt.savefig('test.png' , dpi = 120)
plt.show()
```
こうして得られた図が以下になります。
![test.png](37cfa1dc693055ea305e176bccc147f3.png)
### 調べたこと
2次元のベクトル場に対しては、[matplotlib.axes.Axes.quiver](https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.quiver.html)
にもありますように、quiver(X, Y, U, V, [C])と引数Cを取ればいいとのことですが、3次元ではどのようにすればいいかわからない状態です。私の調査不足かもしれませんが、ご存知の方がいれば教えていただきたいです。
にもありますように、quiver(X, Y, U, V, [C])と引数Cを取ればいいとのことですが、3次元ではどのようにすればいいかわからない状態です。私の調査不足かもしれませんが、ご存知の方がいれば教えていただきたいです。
###追記
can110様、回答ありがとうございます。
以下のようにカラーマップを導入してみました。
```python
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
plt.style.use('ggplot')
plt.rcParams["axes.facecolor"] = 'white'
fig = plt.figure()
ax = fig.gca(projection='3d')
cm = matplotlib.cm.seismic
x = []
y = []
z = []
u = []
v = []
w = []
f = open('test.d')
for line in f:
   data = line.split()
   x.append(float(data[0]))
   y.append(float(data[1]))
   z.append(float(data[2]))
   #プロットの都合でサイズを調節 /2.5
   u.append(float(data[3])/2.5)
   v.append(float(data[4])/2.5)
   w.append(float(data[5])/2.5)
f.close()
ax.set(xlabel='x',ylabel='y',zlabel='z')
ax.quiver(x, y, z, u, v, w, color=cm(0.5*np.array(w)+0.5)
plt.savefig('test.png' , dpi = 120)
plt.show()
```
この結果以下のような図が得られました。
![test.png](b3d1072312ee821bc1266670381a5eeb.png)
  • Python

    37935 questions

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

  • Matplotlib

    1431 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る