Ist diese Lösung nahe genug, um Ihren Wünschen? Es ist leicht von Ricardos Antwort inspiriert, aber ich habe nur ein Legendenobjekt für jede Spalte verwendet und dann das title
-Keyword verwendet, um den Titel jeder einzelnen Spalte festzulegen. Um die Markierungen in die Mitte jeder Spalte zu setzen, habe ich handletextpad
mit einem negativen Wert verwendet, um es rückwärts zu schieben. Zu einzelnen Zeilen gibt es keine Legenden. Ich musste auch einige Leerzeichen in die Titel-Strings einfügen, damit sie auf dem Bildschirm gleich groß aussehen.
Ich merkte auch jetzt, als die Figur gespeichert wurde, dass zusätzliche Änderungen an der genauen Position der Legendenboxen erforderlich sind, aber da ich denke, dass Sie vielleicht noch mehr Sachen im Code optimieren wollen, überlasse ich es Ihnen. Sie müssen möglicherweise auch selbst mit dem handletextpad
spielen, um sie "perfekt" ausgerichtet zu machen.
import matplotlib.pylab as plt
import numpy as np
plt.close('all')
N = 25
y = np.random.randn(N)
x = np.arange(N)
y2 = np.random.randn(25)
# serie A
p1a, = plt.plot(x, y, "ro", ms=10, mfc="r", mew=2, mec="r")
p1b, = plt.plot(x[:5], y[:5] , "w+", ms=10, mec="w", mew=2)
p1c, = plt.plot(x[5:10], y[5:10], "w*", ms=10, mec="w", mew=2)
# serie B
p2a, = plt.plot(x, y2, "bo", ms=10, mfc="b", mew=2, mec="b")
p2b, = plt.plot(x[15:20], y2[15:20] , "w+", ms=10, mec="w", mew=2)
p2c, = plt.plot(x[10:15], y2[10:15], "w*", ms=10, mec="w", mew=2)
line_columns = [
p1a, p2a,
(p1a, p1b), (p2a, p2b),
(p1a, p1c), (p2a, p2c)
]
leg1 = plt.legend(line_columns[0:2], ['', ''], ncol=1, numpoints=1,
title='No prop', handletextpad=-0.4,
bbox_to_anchor=[0.738, 1.])
leg2 = plt.legend(line_columns[2:4], ['', ''], ncol=1, numpoints=1,
title=' Prop + ', handletextpad=-0.4,
bbox_to_anchor=[0.87, 1.])
leg3 = plt.legend(line_columns[4:6], ['', ''], ncol=1, numpoints=1,
title=' Prop * ', handletextpad=-0.4,
bbox_to_anchor=[0.99, 1.])
plt.gca().add_artist(leg1)
plt.gca().add_artist(leg2)
plt.gca().add_artist(leg3)
plt.gcf().show()
bearbeiten
Vielleicht funktioniert das besser. Du musst noch ein paar Sachen optimieren, aber das Alignment-Problem der Bboxen ist weg.
leg = plt.legend(line_columns, ['']*len(line_columns),
title='No Prop Prop + Prop *',
ncol=3, numpoints=1, handletextpad=-0.5)
ich nicht positiv bin, aber ich glaube, es ist ein Beispiel genau, dass in der akzeptierte Antwort tun [diese] (http : //stackoverflow.com/questions/21570007/custom-legend-in-matplotlib) Frage. Oder kann es dich wenigstens in die richtige Richtung weisen? – Ajean
Nein, in diesem Beispiel hat jeder Marker sein eigenes Label. – Serenity
Richtig, aber Sie können dort leere Strings setzen. Ich war eigentlich auf der Suche nach einem anderen Beispiel, das ich hier schon mal gesehen habe (jemand hat eine Legende geschrieben, die etwas Schönes war), aber ich konnte es nicht aufspüren. Nur ein Gedanke, weil ich denke, dass man leere Saiten benutzt. Tut mir leid, ich kann es nicht finden ... – Ajean