2013-04-30 5 views
7

matplotlibチュートリアルのPolyCollectionで例を試してみましたが、奇妙なことに気付きました。私は軸の起源からこの点を取り除くことができなかった。これをどうすれば管理できますか?matplotlib polycollectionの原点を削除できませんでした

enter image description here

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import PolyCollection 
from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 

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

cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) 

xs = np.arange(5, 10, 0.4) 
verts = [] 
zs = [0.0, 1.0, 2.0, 3.0] 
for z in zs: 
    ys = np.random.rand(len(xs)) 
    ys[0], ys[-1] = 0.1, 0 
    verts.append(list(zip(xs, ys))) 

poly = PolyCollection(verts, facecolors = [cc('r'), cc('g'), cc('b'), 
              cc('y')]) 
poly.set_alpha(0.7) 
ax.add_collection3d(poly, zs=zs, zdir='y') 

ax.set_xlabel('X') 
ax.set_xlim3d(0, 10) 
ax.set_ylabel('Y') 
ax.set_ylim3d(-1, 4) 
ax.set_zlabel('Z') 
ax.set_zlim3d(0, 1) 

plt.show() 
+0

バグのような臭いがあります... – tacaswell

+1

3Dコードのバグで、2D軸に同じPloyコレクションを追加すると、予想される結果が得られます。 – tacaswell

+0

このバグはどうすればよいですか? – anatoly

答えて

4

これはPolyCollectionの明示的なクロージング機能とバグです。今の

、それをオフにして、あなたは私が考えるものを得るでしょうが、あなたが期待する結果である:

poly = PolyCollection(verts, facecolors = [cc('r'), cc('g'), cc('b'), 
              cc('y')], closed=False) 

ここでの唯一の問題はが結果を得るべきではありませんあなたはしばらく期待していることです多角形は閉じないでください。。これはもう1つのです.3Dコードに関連するバグです。いずれにせよ、これは辺の周りの線にのみ影響し、あなたの例ではほとんど違いはありません(私はもともと、線幅を広げるまで閉じていないと思っていました)。

PolyCollectionは、頂点を格納するためにpath.Pathオブジェクトを使用し、閉じたポリゴンに対しては、パスをきれいに閉じる(行内に重複しない)CLOSEPOLY頂点コードを使用します。

PolyCollectionの3D投影コードは、あなたのPolyCollectionを取り出し、パスを抽出し、それらのパスから頂点を取り出し、それらの頂点のコードを投げ捨て、それらがすべて実際の頂点座標であると仮定して、むしろハックのようです。オリジナルのPolyCollection上の頂点を直接変更して、2Dの画面を持つ新しいパスを使用します座標がない座標...そして設定に関係なく閉じます。

私はこれを問題#2045として提出しました。

+0

これはありません助け、そして問題は残っている。 滝のプロットをプロットするための他のソリューションはありますか? –

+1

私はそれが役に立たないのか分かりません。これはmatplotlibで修正されたバグを回避するための答えです。現在のバージョンは 'closed = False'の有無にかかわらず動作するはずです。どのバージョンのmatplotlibを実行していますか? – cge

+0

matplotlib 1.3.1とコメントは、 'closed = False'が問題を解決しなかったという事実にありました。プロットされた行は閉じられますが、 'closed = False'を使用すると、matplotlibは最初のポイントから最後のデータポイントまでを結ぶ線でポリゴンを閉じます。 (ちょうど私が一連の曲線をプロットしたかったことを追加する - ラインプロット) –

関連する問題