2015-02-26 12 views
7

Używam Matplotlib, aby w zasadzie narysować "obrazek", a nie do kreślenia danych.Zupełnie niestandardowa legenda w Matplotlib, Pythonie

W "obrazie" używam plt.annotate do oznaczania określonych części obrazu.

Chcę teraz utworzyć całkowicie niestandardową legendę, aby wskazać znaczenie symboli.

Czy istnieje sposób, aby określić niestandardową handles i labels, gdzie handles musi być alfanumeryczne litery zamiast normalnego markerów jak '*' lub 'o'.

Czy to możliwe, czy muszę skonstruować legendę ręcznie przy użyciu plt.annotation?

+0

Możesz zdefiniować własne legendy. Spójrz na [tę odpowiedź] (http://stackoverflow.com/a/27841028/2043505). – Schorsch

+0

Dzięki, ale ta odpowiedź wyjaśnia, jak używać różnych kształtów jako kluczy legendy. Nie wiem, jak zaimplementować alfanumeryczne litery za pomocą tej odpowiedzi. – Jonny

Odpowiedz

11

Istnieje wiele sposobów na zrobienie tego, ale w tym przypadku najprościej jest użyć artysty proxy. Możesz używać dowolnego tekstu jako znacznika, więc łatwo jest mieć fałszywe etykiety pokazu, zamiast linii.

Jako przykład (większość to stosunkowo „fantazyjne” wezwanie do 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

Świetnie! Dziękuję za trud w Twojej odpowiedzi. – Jonny

1

W większości przypadków prawdopodobnie także chcą zilustrować elementy na rysunku kolorem w twojej własnej legendzie. W tym przypadku po prostu użyłbym własnych funkcji matplotlib, niż ty też nie musisz pisać swojej własnej złożonej funkcji.

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() 
Powiązane problemy