Kombiniere zwei Pyplot-Patches für Legende

Ich versuche, einige Daten mit Vertrauensbändern zu zeichnen. Ich mache das mit zwei Plots für jeden Datenstrom: plot und fill_between . Ich möchte, dass die Legende ähnlich wie die Plots aussieht, wo jeder Eintrag eine Schachtel hat (die Farbe des Vertrauensbereichs) mit einer dunkleren, durchdringenden Linie, die durch das Zentrum führt. Bisher habe ich in der Lage, Patches verwenden, um die Rechteck Legende Schlüssel zu erstellen, aber ich weiß nicht, wie die Mittellinie zu erreichen. Ich habe versucht, Luke zu benutzen, aber es gibt keine Kontrolle über die Platzierung, Dicke oder Farbe.

Meine ursprüngliche Idee war, zu versuchen, zwei Patches (Patch und 2DLine) zu kombinieren; Aber es hat noch nicht gearbeitet Gibt es einen besseren Ansatz? Meine MWE und aktuelle Figur sind unten abgebildet.

  • Zeichnen eines Korrelationsgraphen in Matplotlib
  • Matplotlib: Streichung der Offset der Achse in Matplotlib eingeführt 2.0
  • Hinzufügen einer Legende zu einem Radarchart in Python
  • Eine gewichtete USA-Karte basierend auf State-Level-Daten erstellen
  • Wie kann ich 3D-Histogramme in Python machen?
  • Ersetzen Sie Knoten-Etiketten mit emoji mit networkX in Python
  •  import matplotlib.patches as mpatches import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,1,11) y = np.linspace(0,1,11) plt.plot(x, y, c='r') plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5) p = mpatches.Patch(color='r', alpha=0.5, linewidth=0) plt.legend((p,), ('Entry',)) 

    Zahl

  • Keine Web-Prozesse laufen Django in Heroku
  • Wie ignoriere ich Verzeichnisse beim Laufen Django collectstatic?
  • Kann eine Python-Fabric-Aufgabe andere Aufgaben aufrufen und ihre Hosts-Listen respektieren?
  • Voreinstellung zu numpy Array
  • Heroku Push abgelehnt, nicht kompilieren Python / Django App (Python 2.7)
  • Bereitstellung von Python-App auf Mac- und Windows-Benutzer
  • 3 Solutions collect form web for “Kombiniere zwei Pyplot-Patches für Legende”

    Die Lösung entlehnt sich von dem Kommentar von CrazyArm, hier gefunden: Matplotlib, Legende mit mehreren verschiedenen Markern mit einem Label . Anscheinend kannst du eine Liste von Griffen machen und nur ein Etikett zuordnen und es verbindet die beiden Griffe / Künstler magisch.

     import matplotlib.patches as mpatches import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,1,11) y = np.linspace(0,1,11) p1, = plt.plot(x, y, c='r') plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5) p2 = mpatches.Patch(color='r', alpha=0.5, linewidth=0) plt.legend(((p1,p2),), ('Entry',)) 

    Zahl

    Beginnend mit Ihrem Code,

    Das ist das nächste, was ich dir bringen kann. Kann es einen Weg, um die Patch in einer Weise, die Sie wollen, aber ich bin ein bisschen neu, um dies als gut und alles, was ich tun kann, ist die richtige Legende zu bauen:

     import matplotlib.patches as mpatches import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,1,11) y = np.linspace(0,1,11) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(x, y, c='r',label='Entry') plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5) p_handle = [mpatches.Patch(color='r', alpha=0.5, linewidth=0)] p_label = [u'Entry Confidence Interval'] handle, label = ax.get_legend_handles_labels() handles=handle+p_handle labels=label+p_label plt.legend(handles,labels,bbox_to_anchor=(0. ,1.02 ,1.,0.3),loc=8, ncol=5,mode='expand',borderaxespad=0,prop={'size':9},numpoints=1) plt.show() 

    Bildbeschreibung hier eingeben

    Von dem, was ich sagen kann, musst du ein "Künstler" -Objekt erstellen, das dem Design passt, nach dem du suchst, was ich nicht finden kann. Einige Beispiele für etwas Ähnliches finden Sie in diesem Thread: Custom Legend Thread

    Hoffe, das hilft viel Glück, ich interessiere mich, wenn es auch mehr in der Tiefe gibt.

    Ich habe "ähnliche" Fragen. Dank dieser Frage konnte ich folgendes erreichen.

     fig = pylab.figure() figlegend = pylab.figure(figsize=(3,2)) ax = fig.add_subplot(111) point1 = ax.scatter(range(3), range(1,4), 250, marker=ur'$\u2640$', label = 'S', edgecolor = 'green') point2 = ax.scatter(range(3), range(2,5), 250, marker=ur'$\u2640$', label = 'I', edgecolor = 'red') point3 = ax.scatter(range(1,4), range(3), 250, marker=ur'$\u2642$', label = 'S', edgecolor = 'green') point4 = ax.scatter(range(2,5), range(3), 250, marker=ur'$\u2642$', label = 'I', edgecolor = 'red') figlegend.legend(((point1, point3), (point2, point4)), ('S','I'), 'center', scatterpoints = 1, handlelength = 1) figlegend.show() pylab.show() 

    Allerdings überlappen sich meine beiden (Venus und Mars) Marker in der Legende. Ich habe versucht, mit Grifflänge zu spielen, aber das scheint nicht zu helfen. Irgendwelche Vorschläge oder Kommentare wäre hilfreich.

    Python ist die beste Programmiersprache der Welt.