2013-04-30 15 views
7

Tôi đã thử một ví dụ với PolyCollection từ hướng dẫn matplotlib và nhận thấy một điều kỳ lạ. Tôi không thể loại bỏ điểm này từ gốc rìu xem hình. Làm thế nào để quản lý điều này?không thể xóa điểm gốc trong 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

có mùi giống như một lỗi ... – tacaswell

+1

Lỗi với mã 3D, thêm bộ sưu tập mưu đồ tương tự vào trục 2D cho kết quả mong đợi. – tacaswell

+0

và tôi nên làm gì với lỗi này? – anatoly

Trả lời

4

Đây là một lỗi với tính năng kết thúc rõ ràng của PolyCollection.

Còn bây giờ, lần lượt mà đi, và bạn sẽ có được những gì tôi nghĩ là kết quả bạn mong đợi:

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

Vấn đề duy nhất ở đây là bạn không sẽ nhận được kết quả bạn mong đợi trong khi điều này, vì đa giác không được đóng. Đây là một, lỗi liên quan khác với mã 3D. Trong mọi trường hợp, điều này chỉ ảnh hưởng đến đường xung quanh cạnh, và trong ví dụ của bạn nó hầu như không tạo ra bất kỳ sự khác biệt nào (ban đầu tôi nghĩ nó đã được đóng một cách chính xác cho đến khi tôi tăng độ rộng).

PolyCollection sử dụng đường dẫn.Đối tượng chung để lưu trữ các đỉnh và đối với các đa giác kín, sử dụng mã đỉnh CLOSEPOLY, làm sạch đường dẫn (không chồng chéo trong dòng). Mã số chiếu 3D cho PolyCollections có vẻ là một hack chiếm PolyCollection của bạn, trích xuất đường dẫn, lấy các đỉnh từ những đường dẫn đó, ném mã cho các đỉnh đó và giả sử chúng là tất cả các tọa độ đỉnh thực, và sau đó trực tiếp sửa đổi các đỉnh trên PolyCollection ban đầu của bạn để sử dụng các đường dẫn mới có màn hình 2D được chiếu tọa độ không có mã ... và bất kể cài đặt của bạn đã đóng.

Tôi đã gửi vấn đề này là #2045.

+0

điều này không giúp đỡ, và vấn đề vẫn còn. Bất kỳ giải pháp nào khác để vẽ đồ thị các thác nước? –

+1

Tôi không chắc chắn những gì nó là không giúp đỡ: đây là một câu trả lời về làm việc xung quanh một lỗi mà bây giờ là cố định trong matplotlib. Phiên bản hiện tại sẽ hoạt động với hoặc không có 'closed = False'. Bạn đang chạy phiên bản matplotlib nào? – cge

+0

matplotlib 1.3.1 và nhận xét trên thực tế là 'closed = False' không giải quyết được vấn đề; đường vẽ được đóng lại, tuy nhiên khi sử dụng 'closed = False' matplotlib đóng đa giác với một đường nối điểm đầu tiên đến điểm dữ liệu cuối cùng. (chỉ để thêm rằng tôi muốn vẽ một loạt các đường cong - đường thẳng) –

Các vấn đề liên quan