2015-02-26 2 views
7

Я использую Matplotlib для рисования рисунка, а не для печати данных.Полностью пользовательская легенда в Matplotlib, Python

В «картинке» я использую plt.annotate для наложения определенных частей изображения.

Теперь я хочу сделать полностью пользовательскую легенду, чтобы указать значение символов.

Есть ли способ определить пользовательские handles и labels, где handles должен быть алфавитно-цифровые символы вместо обычных маркеров, таких как '*' или 'o'.

Возможно ли это, или я должен построить легенду вручную, используя plt.annotation?

+0

Вы можете определить свои собственные ключи ключей. Взгляните на [этот ответ] (http://stackoverflow.com/a/27841028/2043505). – Schorsch

+0

Спасибо, но этот ответ объясняет, как использовать разные формы в качестве ключей для ключей. Я не уверен, как реализовать буквенно-цифровые буквы, используя этот ответ. – Jonny

ответ

11

Существует много способов сделать это, но в этом случае, возможно, проще всего использовать прокси-исполнителя. Вы можете использовать произвольный текст в качестве маркера, поэтому довольно легко получить поддельные Line2D ярлыки для показа вместо строк.

В качестве примера (большая часть этого является относительно «фантазии» призыв к 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

Отлично! Спасибо за усилия в вашем ответе. – Jonny

1

В большинстве случаев вы, вероятно, также хотят, чтобы показать элементы на графике с цветом в вашей пользовательской легенде. В этом случае я бы просто использовал собственные функции matplotlib, чем вам также не нужно писать собственную сложную функцию.

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() 
Смежные вопросы