2016-07-19 10 views
4

Ich mache etwas Plotten mit Matplotlib, und ich habe eine Legende, die dem Betrachter mitteilt, mit welchen Sensoren die Punkte aufgenommen wurden. Es gibt mehrere Sensoren verschiedener Typen, und ich hätte gerne Untertitel in der Legende, um dem Betrachter zu sagen, welcher Sensor jeder Gruppe ist. Ich habe eine Arbeitslösung, aber es ist ein bisschen wie ein Hack, hier gezeigt:Untertitel innerhalb der Matplotlib-Legende

enter image description here

Wenn die Legende erstellt wird, nimmt es zwei wichtige Argumente: eine Liste der Legende Marker und eine Liste der Legende Etiketten . Meine derzeitige Lösung besteht darin, die Untertitelmarkierung als weiße Box mit weißer Umrandung zu setzen und die Untertitel durch zwei Zeilenumbruchzeichen umgeben zu lassen. Es sieht gut aus, aber es würde viel professioneller aussehen, wenn die Untertitel nicht eingerückt wären. Zwei Problemumgehungen, die ich ausprobiert habe, haben die Markierung des Untertitels auf None gesetzt, und auch die Markierung des Untertitels auf die gewünschte Untertitel-Zeichenfolge und ihre Bezeichnung auf eine leere Zeichenfolge gesetzt. Beide haben nicht funktioniert. Hat jemand damit Erfahrung? Vielen Dank.

+0

Das ist so nah wie ich habe: http://stackoverflow.com/questions/21570007/custom-legend-in-matplotlib/21571063#21571063 – cphlewis

+0

Haben Sie überlegt, die Svg manuell zu bearbeiten? Es ist ein letzter Ausweg, aber wenn Sie nicht viele Zahlen haben, können Sie das schneller tun, als eine programmatische Lösung zu finden. – runDOSrun

Antwort

3

Das Beste, was ich mir vorstellen konnte, ist, einen benutzerdefinierten Handler für einen String zu erstellen.

import matplotlib.pyplot as plt 
import matplotlib.text as mtext 


class LegendTitle(object): 
    def __init__(self, text_props=None): 
     self.text_props = text_props or {} 
     super(LegendTitle, self).__init__() 

    def legend_artist(self, legend, orig_handle, fontsize, handlebox): 
     x0, y0 = handlebox.xdescent, handlebox.ydescent 
     title = mtext.Text(x0, y0, r'\underline{' + orig_handle + '}', usetex=True, **self.text_props) 
     handlebox.add_artist(title) 
     return title 


[line1] = plt.plot(range(10)) 
[line2] = plt.plot(range(10, 0, -1), 'o', color='red') 
plt.legend(['Title 1', line1, 'Title 2', line2], ['', 'Line 1', '', 'Line 2'], 
      handler_map={basestring: LegendTitle({'fontsize': 18})}) 

plt.show() 

output

I basiert dies auf dem Beispiel in http://matplotlib.org/users/legend_guide.html.

+0

Ich freue mich sehr, Ihre Lösung zum Laufen zu bringen. es scheint ziemlich brillant. Leider, wenn ich versuche, es auf meinem Rechner zu starten, erzeugt es den Fehler: RuntimeError: LaTeX war nicht in der Lage, die folgende Zeichenfolge zu verarbeiten: '\\\\ unterstreichen {' Irgendwelche Ideen auf was ist los? –

+0

Ich konnte es funktionieren, indem ich r '\ underline {' + orig_handle + '}' zu orig_handle änderte und auch Usetex = True entfernte. Es wird nicht unterstrichen, aber es funktioniert völlig! –