2017-06-25 4 views
0

次のコードは、ポリゴンの例hereに適合しています。matplotlibにPatchCollectionを追加するときのTkinterコールバックのTypeError Axes3D

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
from matplotlib.collections import PolyCollection, PatchCollection 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import colors as mcolors 

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


def cc(arg): 
    return mcolors.to_rgba(arg, alpha=.6) 

zs = range(4) 
patch_list = [] 
for z in zs: 
    patch = patches.Rectangle((0, 0), 10, 10, color=cc('r')) 
    patch_list.append(patch) 

patch_collection = PatchCollection(patch_list, match_original=True) 
ax.add_collection3d(patch_collection, zs=zs, zdir='y') 
ax.set_xlim3d(0, 10) 
ax.set_ylim3d(-1, 4) 
ax.set_zlim3d(0, 10) 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

それはPolyCollectionのためにうまく働いたが、私はPatchCollectionに切り替えたとき、私は、次のエラーを取得開始しました:それはバックエンドに関係しているよう

Exception in Tkinter callback Traceback (most recent call last): 
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__ 
     return self.func(*args) 
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 590, in callit 
     func(*args) 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 370, in idle_draw 
     self.draw() 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.py", line 351, in draw 
     FigureCanvasAgg.draw(self) 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 464, in draw 
     self.figure.draw(self.renderer) 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/artist.py", line 63, in draw_wrapper 
     draw(artist, renderer, *args, **kwargs) 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/figure.py", line 1144, in draw 
     renderer, self, dsu, self.suppressComposite) 
File "/home/csquires/.local/lib/python2.7/site-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images 
     a.draw(renderer) 
File "/home/csquires/.local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 271, in draw 
     for col in self.collections] 
File "/home/csquires/.local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/art3d.py", line 387, in do_3d_projection 
     vxs, vys, vzs, vis = proj3d.proj_transform_clip(xs, ys, zs, renderer.M) 
File "/home/csquires/.local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.py", line 207, in proj_transform_clip 
     return proj_transform_vec_clip(vec, M) 
File "/home/csquires/.local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.py", line 164, in proj_transform_vec_clip 
     vecw = np.dot(M, vec) TypeError: can't multiply 

sequence by non-int of type 'float' 

が見える - どのように上の任意の提言を代わりに使用しますか?

答えて

1

PatchCollectionの代わりにPatch3DCollectionを使用する必要があります。

インポートPatch3dCollection:Jannickに私のコメントで述べたように

from mpl_toolkits.mplot3d.art3d import Patch3DCollection 

とはまだPatch3DCollectionを使用して、すなわち、Patch3dCollectionに

patch_collection = Patch3DCollection(patch_list, match_original=True) 
+0

、今は接続されていない浮動四角形を取得しています(つまり、私がプロットを回転させると、同じ場所にとどまります) –

0

をPatchCollectionを変更するには、へのパッチを取り付けていない、私に問題を与えましたグラフは適切に表示されます。代わりに、私は、個々のパッチを作成して軸にそれを追加し、3Dにそれを変更するために必要な:これは、パッチがプロットされます作ら

zs = range(4) 
colors = ['r', 'g', 'b', 'y'] 
for i, z in enumerate(zs): 
    rect = patches.Rectangle(xy=(0, 0), width=10, height=10, color=cc(colors[i])) 
    ax.add_patch(rect) 
    art3d.patch_2d_to_3d(rect, z=z, zdir='y') 
関連する問題