2015-02-26 12 views
7

Ich benutze Matplotlib, um grundsätzlich ein "Bild" zu zeichnen, nicht zum Plotten von Daten.Vollständig benutzerdefinierte Legende in Matplotlib, Python

Im 'Bild' verwende ich plt.annotate, um bestimmte Teile des Bildes zu beschriften.

Ich möchte jetzt eine vollständig benutzerdefinierte Legende, um die Bedeutung der Symbole anzuzeigen.

Gibt es eine Möglichkeit zu definieren, benutzerdefinierte handles und labels, wo die handles alphanumerische Buchstaben anstelle der normalen Marker wie '*' oder 'o' sein muss.

Ist das möglich oder muss ich die Legende manuell mit plt.annotation erstellen?

+0

Sie können Ihre eigenen Legendenschlüssel definieren. Werfen Sie einen Blick auf [diese Antwort] (http://stackoverflow.com/a/27841028/2043505). – Schorsch

+0

Danke, aber diese Antwort erklärt, wie verschiedene Formen als Legendenschlüssel verwendet werden. Ich bin mir nicht sicher, wie man mit dieser Antwort alphanumerische Buchstaben implementiert. – Jonny

Antwort

11

Es gibt viele Möglichkeiten, es zu tun, aber es ist wahrscheinlich am einfachsten, einen Proxy-Künstler in diesem Fall zu verwenden. Sie können beliebigen Text als Markierung verwenden, so dass es ziemlich einfach ist, statt der Zeilen falsche Show-Labels zu haben.

Als Beispiel (der größte Teil der hierfür ist der relativ „fancy“ nennen zu 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

Großartig! Danke für die Mühe in deiner Antwort. – Jonny

1

In den meisten Fällen werden Sie wahrscheinlich wollen auch Elemente auf der Grafik mit Farbe zeigen in deiner benutzerdefinierten Legende. In diesem Fall würde ich einfach die eigenen Funktionen von matplotlib verwenden, da Sie auch keine eigene komplexe Funktion schreiben müssen.

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() 
Verwandte Themen