Plotlyのquiver plotで遊んでみた

##はじめに
plotlyを使ってみたいなと思って検索したら、quiver plotなるものを発見。
面白そうなのとあまり日本語訳で書かれた資料がなさそうだったので、遊び半分でトライしました。

#環境
Colab環境下で実施

##内容
渦っぽいグラフを描いてみました。

```python
import plotly.figure_factory as ff
import numpy as np
import math

x,y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

r = np.sqrt(x**2+y**2)
u = -y*np.exp(r)
v = x*np.exp(r)

fig = ff.create_quiver(x, y, u, v)
fig.update_layout(width=500, height=500,xaxis_range=[-1,1],yaxis_range=[-1,1]) 

fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/5ae64a16-84b4-bd7a-4d88-2bce53a66058.png)

各要素の意味を表にまとめました。

| パラメータ | 意味 | 追記 |
|:-----------:|:------------:|:------------:|
| x       | 矢印のx座標位置        | listかndarrayで定義        |
| y     | 矢印のy座標位置      | 〃       |
| u       | 矢印のベクトルx座標要素        | 〃         |
| v         | 矢印のベクトルy座標要素         |   〃        |
| scale       | 矢印のサイズ       | 0~1までの範囲。デフォルトは0.1。       |
| arrow_scale    | 矢じりあごの長さ     | デフォルトは0.3     |
| angle         |  矢じりの角度         | デフォルトはpi/9           |
| scaleratio       | x軸に対するy軸の比       | デフォルトはNone       |

ちなみに矢じりあごは赤丸のところ。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/3a2802d0-560f-236a-2a61-40e8bb4e09c9.png)

###①ベクトル要素の変更

```python
import plotly.figure_factory as ff
import numpy as np
import math

x,y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

r = np.sqrt(x**2+y**2)
u = -y*np.exp(r)*np.cos(x)
v = x*np.exp(r)*np.sin(y)

fig = ff.create_quiver(x, y, u, v,)
fig.update_layout(width=500, height=500,xaxis_range=[-1,1],yaxis_range=[-1,1]) 

fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/360d1898-685e-e6a4-deaa-2fe94dd2c2f4.png)

###②矢印の変更
####②-1 サイズ
```python
import plotly.figure_factory as ff
import numpy as np
import math

x,y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

r = np.sqrt(x**2+y**2)
u = -y*np.exp(r)
v = x*np.exp(r)

#矢印サイズの変更
fig = ff.create_quiver(x, y, u, v, scale=0.5)
fig.update_layout(width=500, height=500,xaxis_range=[-1,1],yaxis_range=[-1,1]) 

fig.show()
```
大きくしすぎてちょっと見にくい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/d503f751-4afd-9d17-8b7d-6d371c810039.png)

####②-2 矢じりの変更
```python
import plotly.figure_factory as ff
import numpy as np
import math

x,y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

r = np.sqrt(x**2+y**2)
u = -y*np.exp(r)
v = x*np.exp(r)

#矢じりの変更
fig = ff.create_quiver(x, y, u, v, arrow_scale=0.7, angle=math.pi/4)
fig.update_layout(width=500, height=500,xaxis_range=[-1,1],yaxis_range=[-1,1]) 

fig.show()
```
矢じりを長くして角度も広げたら、ちょっとコミカルに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/e1534724-3bc0-d702-806e-9df9dd0f8014.png)

###③ スケールの変更
```python
import plotly.figure_factory as ff
import numpy as np
import math

x,y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

r = np.sqrt(x**2+y**2)
u = -y*np.exp(r)
v = x*np.exp(r)

#スケールの変更
fig = ff.create_quiver(x, y, u, v, scaleratio=0.5)
fig.update_layout(width=500, height=500,xaxis_range=[-1,1],yaxis_range=[-1,1]) 

fig.show()
```
y軸方向のサイズが圧縮されて、歪になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/02a35197-56f7-f81c-775e-de1a80837d8a.png)

##まとめ
英語の資料が多くてちょっと苦労したけど、quiver plotを試すことができました。
ただ3Dは対応していないのが残念(matplotlibを使うかPlotlyのcone plotを使うしか、今のところないらしい)。

##参考
渦のグラフ
https://physics-school.com/grad-div-rot/

Plotlyについて
https://ai-research-collection.com/plotly-quiver-plots/
https://plotly.github.io/plotly.py-docs/generated/plotly.figure_factory.create_quiver.html