2014-06-20 9 views
2

나는 두 개의 변수에 함수를 플롯하기 위해 노력하고있어이 구분 알려진 삼각형, 더 또는 덜 등의 세트 정의 : 이상적으로Matplotlib - mplot3d : 3 차원 플롯에서 z = 0 축에 투영 된 triplot?

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

def f(x, y): 
    if x + y < 1: return 0 
    else: return 1 

x = [0, 1, 1, 0] 
y = [0, 0, 1, 1] 
tris = [[0, 1, 3], [1, 2,3]] 

fig = plt.figure() 
ax = fig.add_subplot(121) 
ax.triplot(x, y, tris) 

xs = [random.random() for _ in range(100)] 
ys = [random.random() for _ in range(100)] 
zs = [f(xs[i], ys[i]) for i in range(100)] 
ax2 = fig.add_subplot(122, projection='3d') 
ax2.scatter(xs, ys, zs) 
plt.show() 

, 나는 삼각형을 투영함으로써 하나에 모두 줄거리를 결합하는 것 축 z = 0에 놓습니다. 나는 이것이 2d 플롯의 다른 변형과 가능하지만 triplot과는 가능하지 않음을 안다. 내가 원하는 것을 얻을 수 있습니까?

추신. 이것은 현재 사용중인 실제 구현의 상당히 단순화 된 버전이므로 임의의 산란이 약간 이상하게 보일 수 있습니다.

답변

0

저는 전문가는 아니지만 흥미로운 문제였습니다. 주변을 샅샅이 뒤진 후, 나는 뭔가 가깝다고 생각합니다. Triangulation 객체를 수동으로 만든 다음 plot과 z의 0리스트를 plot_trisurf에 넘겨주고 z = 0에서 삼각형을 올바른 위치에 놓습니다.

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

def f(x, y): 
    if x + y < 1: return 0 
    else: return 1 

x = [0, 1, 1, 0] 
y = [0, 0, 1, 1] 
tris = [[0, 1, 3], [1, 2,3]] 
z = [0] * 4 

triv = tri.Triangulation(x, y, tris) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
trip = ax.plot_trisurf(triv, z) 
trip.set_facecolor('white') 

xs = [random.random() for _ in range(100)] 
ys = [random.random() for _ in range(100)] 
zs = [f(xs[i], ys[i]) for i in range(100)] 

ax.scatter(xs, ys, zs) 
plt.show() 

ETA : 색상 맵을 따르지 않고 흰색으로 만들기 위해 Poly3DCollection에서 set_facecolor에 대한 호출을 추가했습니다. 원하는 효과를 발휘할 수 있습니다 ...

+0

흥미 롭군요! 그 생각을하지 않았다, 정말 고마워요 :) –