Einstellung eine Feste Größe für die Punkte in der Legende
Mache ich einige streudiagramme und ich möchte legen Sie die Größe der Punkte in der Legende zu einem festen, den gleichen Wert hat.
Jetzt habe ich dieses:
import matplotlib.pyplot as plt
import numpy as np
def rand_data():
return np.random.uniform(low=0., high=1., size=(100,))
# Generate data.
x1, y1 = [rand_data() for i in range(2)]
x2, y2 = [rand_data() for i in range(2)]
plt.figure()
plt.scatter(x1, y1, marker='o', label='first', s=20., c='b')
plt.scatter(x2, y2, marker='o', label='second', s=35., c='r')
# Plot legend.
plt.legend(loc="lower left", markerscale=2., scatterpoints=1, fontsize=10)
plt.show()
produziert:
Sind die Größen der Punkte in der Legende sind skaliert, aber nicht die gleichen. Wie kann ich das beheben die Größen der Punkte in der Legende zu einem gleichen Wert, ohne die Größen in der scatter
plot?
InformationsquelleAutor der Frage Gabriel | 2014-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich einen Blick in den source-code von
matplotlib
. Schlechte Nachricht ist, dass es scheint nicht zu sein jede einfache Art der Einstellung gleich die Größen der Punkte in der Legende. Besonders schwierig ist es, mit scatter-plots (falsch: siehe update unten). Es gibt im wesentlichen zwei alternativen:maplotlib
codePathCollection
- Objekte, die die Punkte in das Bild. Die Transformation (Skalierung), um die Originale Größe zu berücksichtigen.Weder von diesen sehr viel Spaß, obwohl #1 scheint einfacher zu sein. Die
scatter
Grundstücke sind besonders anspruchsvoll in dieser Hinsicht.Allerdings habe ich das hack, das tut wahrscheinlich das, was Sie wollen:
Gibt es:
Scheint das zu sein, was Sie wollte.
Änderungen:
scatter
geändert in eineplot
werden, ändert sich die Markierung Skalierung (daher dersqrt
) und macht es unmöglich, zu verwenden ändern der marker-Größe (wenn das beabsichtigt war)Wie Sie sehen können, dieser nutzt versteckte Unterstrich Eigenschaften (
_legmarker
) und ist bug-hässlich. Es kann brechen und sich bei jedem update inmatplotlib
.Update
Haa, ich habe es gefunden. Eine bessere hack:
Nun die
_sizes
(ein weiterer Unterstrich Eigenschaft) funktioniert der trick. Keine Notwendigkeit, berühren Sie die Quelle, obwohl dies ist ein ziemlich hack. Aber jetzt können Sie allesscatter
bietet.InformationsquelleAutor der Antwort DrV
Ähnlich wie die Antwort, vorausgesetzt, Sie wollen alle Marker mit der gleichen Größe:
Mit MatPlotlib 2.0.0
InformationsquelleAutor der Antwort Bruno Morais
Hatte ich nicht viel Erfolg mit @DrV - Lösung, aber vielleicht ist mein use-case ist einzigartig. Aufgrund der Dichte der Punkte, bin ich mit der kleinsten Markierung Größe, d.h.
plt.plot(x, y, '.', ms=1, ...)
und möchten, dass die Legende die Symbole größer.Folgte ich der Empfehlung, die ich gefunden auf der matplotlib Foren:
xlimits = plt.xlim()
)plt.xlim(xlimits)
)Hier ist, wie es stellte sich heraus (für das die dots sind eigentlich weniger wichtig, dass die Linien):
Hoffe, dies hilft jemand anderes.
InformationsquelleAutor der Antwort Steven C. Howell
Nur eine andere alternative hier. Dies hat den Vorteil, dass es keine "private" - Methoden und funktioniert auch mit anderen Objekten als zerstreut vorhanden in der Legende. Der Schlüssel ist die Karte der scatter
PathCollection
zu einemHandlerPathCollection
mit einer Update-Funktion festgelegt wird.Komplettes code-Beispiel:
InformationsquelleAutor der Antwort ImportanceOfBeingErnest
Können Sie ein Line2D-Objekt, das ähnelt Ihrem gewählten Marker, außer mit einem anderen marker der Größe Ihrer Wahl, und verwenden Sie, dass die zur Konstruktion der Legende. Das ist nett, weil es nicht erforderlich ist, platzieren Sie ein Objekt in Ihre Achsen (potenziell Triggerung ein resize-Ereignis), und es erfordert nicht die Verwendung von versteckten Parametern. Der einzige wirkliche Nachteil ist, dass Sie die zur Konstruktion der Legende ausdrücklich von Listen der Objekte und Beschriftungen, aber diese ist sehr gut dokumentiert matplotlib-Funktion, so dass es fühlt sich ziemlich sicher zu verwenden.
Link zum resultierenden Bild
InformationsquelleAutor der Antwort Jeremy Bancroft Brown