3차원 벡터를 그래프로 그리고 싶은데, 마땅한 방법이 없어 여기저기 찾다가 quiver라는 함수를 발견했다.

지금까지는 2차원 벡터를 그리기 위해서 arrow함수만을 계속 사용했었기에 quiver는 사용법이 생소했다.

다른 블로그에도 생각보다 자료가 많지는 않았다.. 특히 내가 그리고 싶은 형태의 그래프를 그리는 법은 별로 나와있지 않았다ㅠㅠ그래서 미래의 나를 위해 한번 정리하고 넘어가려고 한다.

quiver plot ? 

2차원 평면에서 화살표가 있는 직선을 그리는 그래프이다. arrow plot과 비슷한 형태를 가진다.

하지만 나는 3차원 벡터를 가지고 그래프를 그리기 위해서 사용해 보겠다...

 

공식문서에서 제공하는 quiver plot 예시...다양하다 


공식문서 간단 정리

quiver([X, Y], U, V, [C], **kw)

- 필수 매개 변수

X , Y : 화살표 위치를 정의

U , V : 화살표 방향을 정의

 

- 선택 매개 변수

C : 색상 설정

**kw : PolyCollection 속성 - color, edgecolor, label, linestyle, visible 등등

 

- 기타 매개 변수

scale_units : { 'width', 'height', 'dots', 'inches', 'x', 'y', 'xy'}

headwidth, headlength, headaxislength, minshaft, minlength 등등

 

공식문서 링크 ↓

(matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.quiver.html)

 


공식문서 함수 사용 예시

from mpl_toolkits.mplot3d import Axes3D 

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

# Make the grid
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.8))

# Make the direction data for the arrows
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
     np.sin(np.pi * z))

ax.quiver(x, y, z, u, v, w, length=0.1, normalize=True)

plt.show()

- Matplotlib에서 지원하는 플롯의 축은 기본적으로 2차원이기 때문에, mplot3d 툴킷에서 Axes3D 클래스를 가져와줘야 3차원 축에 대한 투영이 가능하다.

- fig.gca(projection='3d') 를 통해 3차원 객체를 만든다. fig.add_subplot(111,projection='3d') 라고 써도 같은 결과를 나타낸다.

위의 예시를 통해 그려지는 그래프


내가 그려보는 간단버전 3차원 벡터 그래프

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D 

#3차원 벡터 아무거나 선언
a = np.array([2,4,5])
b = np.array([-3,1,4])
c = np.array([0,7,1])

#그래프를 그릴 3d 영역 설정
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d') #또는 fig.gca(projection='3d')

#그래프를 그려보자 - ax.quiver(시작x좌표,시작y좌표,시작z좌표,x좌표,y좌표,z좌표 + 색상은 옵션)
a_plot = ax.quiver(0,0,0,a[0],a[1],a[2],color='red')
b_plot = ax.quiver(0,0,0,b[0],b[1],b[2],color='blue')
c_plot = ax.quiver(0,0,0,c[0],c[1],c[2],color='green')

#그래프를 나타낼 범위 (적당히 넉넉하게 지정해 주자)
ax.set_xlim([-5,3])
ax.set_ylim([0,8])
ax.set_zlim([0,5])

#그래프 범례 표시 - 왼쪽 위로 설정함
ax.legend([a_plot, b_plot, c_plot], ['a', 'b', 'c'], loc='upper left')

#그래프 제목 설정
ax.set_title('3 dimensional vector with quiver')

완성된 그래프!


참고자료

- matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.quiver.html

- matplotlib.org/3.1.1/gallery/mplot3d/quiver3d.html

- wikidocs.net/14645

- matplotlib.org/3.1.1/gallery/images_contours_and_fields/quiver_simple_demo.html#sphx-glr-gallery-images-contours-and-fields-quiver-simple-demo-py


벡터가 뭔지 이틀 전부터 알게 되어서 이제 막 공부하고 있는 사람이라 내용 설명이 충분치 않을 수 있습니다. 자세한 내용은 공식 문서를 참고해 주세요! (솔직히 내가 그린 예제랑 공식문서 예제 말고는 어느 분야에서 사용하는지도 잘 모름)

+ Recent posts