Matplotlib에서 3D 큐브, 구 및 벡터 플로팅
Matplotlib로 가능한 한 적은 지침으로 무언가를 그리는 방법을 검색하지만 문서에서 이에 대한 도움말을 찾지 못했습니다.
다음과 같은 것을 플롯하고 싶습니다.
- 측면 길이가 2 인 0을 중심으로하는 와이어 프레임 큐브
- 반경이 1 인 0을 중심으로하는 "와이어 프레임"구
- 좌표 [0, 0, 0]의 점
- 이 지점에서 시작하여 [1, 1, 1]로가는 벡터
그렇게하는 방법?
약간 복잡하지만 다음 코드로 모든 객체를 그릴 수 있습니다.
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")
# draw cube
r = [-1, 1]
for s, e in combinations(np.array(list(product(r, r, r))), 2):
if np.sum(np.abs(s-e)) == r[1]-r[0]:
ax.plot3D(*zip(s, e), color="b")
# draw sphere
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
ax.plot_wireframe(x, y, z, color="r")
# draw a point
ax.scatter([0], [0], [0], color="g", s=100)
# draw a vector
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
class Arrow3D(FancyArrowPatch):
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
FancyArrowPatch.draw(self, renderer)
a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20,
lw=1, arrowstyle="-|>", color="k")
ax.add_artist(a)
plt.show()
화살표 만 그리는 경우 더 쉬운 방법이 있습니다.
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")
#draw the arrow
ax.quiver(0,0,0,1,1,1,length=1.0)
plt.show()
quiver는 실제로 한 번에 여러 벡터를 그리는 데 사용할 수 있습니다. 사용법은 다음과 같습니다.-[from http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver]
떨림 (X, Y, Z, U, V, W, ** kwargs)
Arguments:
X, Y, Z: The x, y and z coordinates of the arrow locations
U, V, W: The x, y and z components of the arrow vectors
The arguments could be array-like or scalars.
Keyword arguments:
length: [1.0 | float] The length of each quiver, default to 1.0, the unit is the same with the axes
arrow_length_ratio: [0.3 | float] The ratio of the arrow head with respect to the quiver, default to 0.3
pivot: [ ‘tail’ | ‘middle’ | ‘tip’ ] The part of the arrow that is at the grid point; the arrow rotates about this point, hence the name pivot. Default is ‘tail’
normalize: [False | True] When True, all of the arrows will be the same length. This defaults to False, where the arrows will be different lengths depending on the values of u,v,w.
참고URL : https://stackoverflow.com/questions/11140163/plotting-a-3d-cube-a-sphere-and-a-vector-in-matplotlib
'Nice programing' 카테고리의 다른 글
C# Convert a Base64 -> byte[] (0) | 2020.11.16 |
---|---|
How to find index position of an element in a list when contains returns true (0) | 2020.11.16 |
Pass data through segue (0) | 2020.11.16 |
BREW 오류 : 심볼릭 링크 불가, 경로 쓰기 불가 (0) | 2020.11.16 |
What does 'extended' mean in express 4.0? (0) | 2020.11.16 |