2010-05-07 38 views
11

Tôi muốn kiểm soát vị trí của các chốt hình matplotlib trên một đường đồng mức, nhưng không sử dụng cờ thủ công = Đúng trong nhãn. Ví dụ, tôi muốn chỉ định một tọa độ x, và có các nhãn được tạo ra tại các điểm đi qua dòng này. Tôi thấy rằng bạn có thể nhận được vị trí của các nhãn riêng lẻ bằng cách sử dụng get_position(), nhưng tôi bị kẹt ở đó. Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn!Matplotlib Đường viền nhãn Vị trí

Trả lời

5

Không, không có cách nào được xây dựng thành matplotlib để làm điều đó. Bạn có nghĩa vụ hoặc là sống với các địa điểm mặc định hoặc đi hoàn toàn tương tác với hướng dẫn sử dụng và sử dụng chuột.

Bạn có thể muốn gửi báo cáo này dưới dạng báo cáo lỗi ở trên để họ có thể cải thiện thuật toán của mình.

Có nhiều tùy chọn để giải quyết vấn đề này. Đầu tiên là đặt văn bản theo chương trình trên hình con đường. Bạn sẽ không thể xóa một cách đáng tin cậy các dòng bên dưới văn bản theo cách này. Giả sử bạn có đường viền c, bạn có thể tìm thấy đường bao trong c.collections. Đối với mỗi đường bao gọi get_paths và đặt văn bản của bạn trên đường dẫn đó.

Tùy chọn khác sẽ là thay thế mã cho vị trí thủ công (trong matplotlib.contour.BlockingContourLabeler) hoặc tinh chỉnh mã tìm vị trí nhãn (trong matplotlib.contour.locate_label), nhưng cả hai hàm đều khá dày đặc. Nếu bạn có thể đưa ra một sự thay thế làm việc cho locate_label chỉ ghi đè lên các phương pháp cũ trong âm mưu của bạn vĩ mô

def your_locate_label(self, linecontour, labelwidth): 
    # some magic 
    pass 

ar = np.array([[1,0], [0,1]] 
c = matplotlib.contour(ar) 
c.locate_label = your_locate_label 

c.clabel() 

Btw, nếu bạn sử dụng ipython bạn có thể dễ dàng xem các nguồn chức năng từ phiên tương tác của bạn với

%psource c.clabel 

hoặc trực tiếp gọi của bạn $EDITOR vào file được nó được định nghĩa với

%edit c.clabel 
+0

tôi không tìm thấy vấn đề này được đăng, vì vậy tôi làm mới: https://github.com/matplotlib/matplotlib/issues/613 – keflavich

9

Vâng, hiện nay là một cách để kiểm soát vị trí nhãn! https://github.com/matplotlib/matplotlib/pull/642

plt.figure() 
CS = plt.contour(X, Y, Z) 
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)] 
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations) 
+0

thủ công có thể là một đối tượng iterable của x, y tuples. Nhãn đường bao sẽ được tạo ra như thể chuột được nhấp vào mỗi vị trí x, y. – Faber

+2

Có cách nào để cho phép ghi nhãn tự động, và sau đó lặp qua các nhãn để loại bỏ (và có thể cải thiện) bất kỳ nhãn nào giao cắt các trục? –

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