수색…


비고

matplotlib의 3 차원 플로팅은 역사적으로 렌더링 엔진이 본질적으로 2 차원이기 때문에 약간의 단점이있었습니다. 3D 설치가 다른 2D 청크 뒤에 플로팅하여 렌더링된다는 사실 은 종종 객체의 명백한 깊이와 관련된 렌더링 문제가 있음을 의미합니다. 문제의 핵심은 서로 연결되지 않은 두 개의 객체가 서로 완전히 뒤에서 또는 완전히 앞에있을 수 있기 때문에 두 개의 연동 된 고리 (애니메이션 GIF를 보려면 클릭)의 아래 그림과 같은 아티팩트로 이어지는 것입니다.

유물을 보여주는 두 개의 연동 된 고리의 3 차원 줄거리

그러나 이것은 고칠 수 있습니다. 이 유물은 동일한 플롯에 여러 개의 서페이스를 플로팅 할 때만 존재합니다. 각 플롯은 하나의 매개 변수가 뷰 거리를 결정하는 평면 2D 모양으로 렌더링됩니다. 하나의 복잡한 표면이 동일한 문제를 겪지 않음을 알 수 있습니다.

이 문제를 해결하는 방법은 투명 브리지를 사용하여 플롯 객체를 함께 결합하는 것입니다.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erf

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

X = np.arange(0, 6, 0.25)
Y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(X, Y)

Z1 = np.empty_like(X)
Z2 = np.empty_like(X)
C1 = np.empty_like(X, dtype=object)
C2 = np.empty_like(X, dtype=object)

for i in range(len(X)):
  for j in range(len(X[0])):
    z1 = 0.5*(erf((X[i,j]+Y[i,j]-4.5)*0.5)+1)
    z2 = 0.5*(erf((-X[i,j]-Y[i,j]+4.5)*0.5)+1)
    Z1[i,j] = z1
    Z2[i,j] = z2

    # If you want to grab a colour from a matplotlib cmap function, 
    # you need to give it a number between 0 and 1. z1 and z2 are 
    # already in this range, so it just works as is.
    C1[i,j] = plt.get_cmap("Oranges")(z1)
    C2[i,j] = plt.get_cmap("Blues")(z2)


# Create a transparent bridge region
X_bridge = np.vstack([X[-1,:],X[-1,:]])
Y_bridge = np.vstack([Y[-1,:],Y[-1,:]])
Z_bridge = np.vstack([Z1[-1,:],Z2[-1,:]])
color_bridge = np.empty_like(Z_bridge, dtype=object)

color_bridge.fill((1,1,1,0)) # RGBA colour, onlt the last component matters - it represents the alpha / opacity.

# Join the two surfaces flipping one of them (using also the bridge)
X_full = np.vstack([X, X_bridge, np.flipud(X)])
Y_full = np.vstack([Y, Y_bridge, np.flipud(Y)])
Z_full = np.vstack([Z1, Z_bridge, np.flipud(Z2)])
color_full = np.vstack([C1, color_bridge, np.flipud(C2)])

surf_full = ax.plot_surface(X_full, Y_full, Z_full, rstride=1, cstride=1,
                            facecolors=color_full, linewidth=0,
                            antialiased=False)

plt.show()

서로 교차하는 두 개의 표면 여기에 이미지 설명을 입력하십시오.

3 차원 축 생성

Matplotlib 축은 기본적으로 2 차원입니다. 3 차원 플롯을 만들려면 mplot3d 툴킷 에서 Axes3D 클래스를 가져 Axes3D . 즉, '3d' 축에 대해 새로운 종류의 투영이 가능합니다.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

라인 플롯 , 스 캐터 플롯 , 바 플롯 , 등고선 플롯 과 같은 2 차원 플롯의 일반적인 일반화 외에도 ax.plot_surface 와 같은 몇 가지 표면 플롯 방법 을 사용할 수 있습니다.

# generate example data
import numpy as np
x,y = np.meshgrid(np.linspace(-1,1,15),np.linspace(-1,1,15))
z = np.cos(x*np.pi)*np.sin(y*np.pi)

# actual plotting example
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# rstride and cstride are row and column stride (step size)
ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$\cos(\pi x) \sin(\pi y)$')
plt.show()

표면 플롯이있는 Axes3D



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow