2011-10-31 3 views
2

2D 투영과 3D 투영을 전환 할 수 있도록 matplotlib 그림이 있습니다. 나는 2D에서 3D로 갈 수 있지만 다른 방향으로가는 방법을 생각할 수는 없습니다. 예 ...matplotlib 3d to 2d

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

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 

# Create a 3D scatter plot... 
ax = fig.add_subplot(111, projection='3d') 
n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 
    ax.scatter(xs, ys, zs, c=c, marker=m) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

# Now I want a 2D plot... 
ax.cla() 
ax = fig.add_subplot(111) 
ax.plot(xs, ys) 

plt.show() 

플롯은 3D 프로젝션 및 프로젝션에 남아 = "2D는"

내가 아마 ax.clf() 내가 원하는 일을 할 것이라고 생각 ... 유효한 kwarg 아니다 새로운 인물을 정의하겠습니다. 하지만 그저 다음과 같은 오류가 발생합니다 : ValueError : 알 수없는 요소 o

누구든지 해결책을 제시 할 수 있습니까? ValueError가 문제와 관련되어 있습니까? 아니면 설치시 잘못된 점이 있습니까? 투영을 3D에서 2D로 전환하는 kwarg가 있습니까?

제공 할 수있는 포인터에 대해 미리 감사드립니다. 단

답변

2

나는 가능한 해결책을 찾았다 고 생각하지만 약간의 메모리 문제가있는 것으로 보인다. 필자는 초기 플롯 데이터를 실제로 삭제하지 않고 단지 그림에서 제거하여 투영이 변경 될 때마다 메모리 사용량이 증가한다고 의심합니다.

# Delete the 3D subplot 
self.fig.delaxes(self.axes) 
# Create a new subplot that is 2D 
self.axes = self.fig.add_subplot(111) 
# 2D scatter 
self.axes.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o') 
# Update the figure 
self.canvas.draw() 
0

내가 실제로 사용했던 이전 질문의 답변을 찾아서 구분하여 수용률 (현재 0 %)을 높이면 더 많은 사람들이 기꺼이 도움을 줄 것이라고 말함으로써 시작하겠습니다. 당신.

이제 질문에 대답하기 위해 '2d'투영 kwarg가 없습니다. 그러나 'q'라는 키워드에 따라 원하는 프로젝션 유형을 신속하게 결정하려면 다음이 도움이 될 것입니다. 루프의 외부에서 플로팅 콜을했기 때문에 다른 종류의 플롯 간의 혼동을 피하기 위해 기본 설정을 변경하고 일반적으로 조직을 정리했습니다.

희망이 도움이됩니다.

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

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 
plt.clf() 

q='2d' 

n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 

if q=='3d': 

    # Create a 3D scatter plot... 
    ax = fig.add_subplot(111, projection='3d') 
    ax.scatter(xs, ys, zs, c=c, marker=m) 
    ax.set_xlabel('X Label') 
    ax.set_ylabel('Y Label') 
    ax.set_zlabel('Z Label') 
    plt.show() 

else: 
    plt.clf() 
    ax = fig.add_subplot(111) 
    ax.plot(xs, ys) 
    ax.set_xlabel('X Label') 
    ax.set_ylabel('Y Label') 
    plt.show() 
+0

귀하의 입력 cosmosis 주셔서 감사합니다. 동의하고 투표하는 것이 똑같은 것이 아니라고 나는 놓쳤다. 내 실수를 바로 잡았어. 제 간단한 예제로 인해 제 질문이 다소 모호해야합니다. 저는 하나의 그림을 2D와 3D 투영법 사이에서 전환 할 수 있기를 원합니다. 그림은 wxPython GUI의 캔버스에 있습니다. 이 아이디어를 어떻게 달성 할 수 있습니까? – Dan

1

나는 동일한 문제를 안고 있었고 수용된 해결책을 시도했습니다 (Dan이 게시했습니다). 그것은 작동하지만, 나에게 다음과 같은 경고했다 : 내가 사용하지만 경우

"UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect."

:

self.figure.clf() 
self.axes = self.figure.add_subplot(111) 

다음은 경고없이 작동합니다.