2011-10-31 10 views
2

私は、2D投影と3D投影を切り替えることができるmatplotlibの図を持っています。私は2Dから3Dに行くことができますが、私は他の方法に行く方法を考えることができません。例...matplotlib 3dから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」は有効なkwargではありません...

私は(おそらくax.clfを考えた)私が欲しかったものだろう私は新しい人物を定義しましょう。しかし、それはちょうど私に次のエラーを与えます: ValueError:不明な要素o

誰も私にこのことに対するヒントを教えてもらえますか? ValueErrorは問題に関連していますか、または設定に何か他の問題があることを示唆していますか?投影を3Dから2Dに切り替えるkwargはありますか?

あなたが提供できるポインタについて、事前に多くのお礼を申し上げます。 Dan

答えて

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

あなたの入力コスモスに感謝します。私は受け入れて投票するのが同じものではなかったことを忘れてしまった!私の間違いを訂正しました。 私の質問は私の単純化された例のため多少あいまいであるはずです。 1つの図形を2つの図形と3つの図形の間で切り替えることができ、どちらか一方を作成することはできません。図は、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) 

それは警告なしで動作します。

関連する問題