2015-02-26 16 views
7

Tôi đang sử dụng Matplotlib về cơ bản vẽ 'ảnh', không phải để vẽ dữ liệu.Truyền thuyết tùy chỉnh hoàn toàn trong Matplotlib, Python

Trong 'ảnh' tôi sử dụng plt.annotate để gắn nhãn một số phần nhất định của hình ảnh.

Tôi bây giờ muốn tạo chú thích hoàn toàn tùy chỉnh để biểu thị ý nghĩa của các biểu tượng.

Có cách nào để xác định tùy chỉnh handleslabels, nơi handles phải chữ chữ và số thay cho dấu bình thường như '*' hay 'o'.

Tôi có thể hoặc phải xây dựng chú giải theo cách thủ công bằng cách sử dụng plt.annotation?

+0

Bạn có thể xác định bạn sở hữu khóa chú giải. Hãy xem [câu trả lời này] (http://stackoverflow.com/a/27841028/2043505). – Schorsch

+0

Cảm ơn, nhưng câu trả lời đó giải thích cách sử dụng các hình dạng khác nhau làm khóa chú giải. Tôi không chắc chắn làm thế nào để thực hiện chữ cái và chữ số bằng cách sử dụng câu trả lời đó. – Jonny

Trả lời

11

Có rất nhiều cách để làm điều đó, nhưng có thể dễ dàng nhất khi sử dụng một nghệ sĩ proxy trong trường hợp này. Bạn có thể sử dụng văn bản tùy ý làm điểm đánh dấu, do đó, khá dễ dàng để có các nhãn hiển thị giả của Line2D thay vì dòng.

Như một ví dụ (phần lớn trong số này là tương đối "ưa thích" gọi đến annotate):

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

def main(): 
    labels = ['A', 'B', 'C'] 
    positions = [(2, 5), (1, 1), (4, 8)] 
    descriptions = ['Happy Cow', 'Sad Horse', 'Drooling Dog'] 

    # Plot the data, similar to what you described... 
    fig, ax = plt.subplots() 
    ax.imshow(np.random.random((10, 10)), interpolation='none') 
    for label, xy in zip(labels, positions): 
     ax.annotate(label, xy, xytext=(20, 20), size=15, 
        textcoords='offset points', 
        bbox={'facecolor':'white'}, 
        arrowprops={'arrowstyle':'->'}) 

    # Create a legend with only labels 
    proxies = [create_proxy(item) for item in labels] 
    ax.legend(proxies, descriptions, numpoints=1, markerscale=2) 

    plt.show() 

def create_proxy(label): 
    line = matplotlib.lines.Line2D([0], [0], linestyle='none', mfc='black', 
       mec='none', marker=r'$\mathregular{{{}}}$'.format(label)) 
    return line 

main() 

enter image description here

+0

Tuyệt vời! Cảm ơn những nỗ lực trong câu trả lời của bạn. – Jonny

1

Trong hầu hết các trường hợp, bạn có lẽ cũng muốn để minh họa các yếu tố trên hình ảnh với màu sắc trong chú thích tùy chỉnh của bạn. Trong trường hợp này, tôi chỉ đơn giản sử dụng các hàm riêng của matplotlib, hơn là bạn cũng không cần viết hàm phức tạp của riêng mình.

import matplotlib 

red_line = matplotlib.lines.Line2D([], [], color='red',markersize=100, label='Blue line') 


blue_line = matplotlib.lines.Line2D([], [], color='blue', markersize=100, label='Green line') 
purple_line = matplotlib.lines.Line2D([], [], color='purple', markersize=100, label='Green line') 

handles = [blue_line,red_line, purple_line] 
labels = [h.get_label() for h in handles] 

ax.legend(handles=handles, labels=labels) 
plt.show() 
Các vấn đề liên quan