Ho dato un'occhiata al codice sorgente di matplotlib
. La cattiva notizia è che non sembra esserci un modo semplice per impostare le dimensioni uguali dei punti nella legenda. È particolarmente difficile con i grafici a dispersione (errati: vedere l'aggiornamento sotto). Ci sono essenzialmente due alternative:
- modificare il codice
maplotlib
Aggiungi una trasformazione nelle PathCollection
oggetti che rappresentano i punti nell'immagine. La trasformazione (ridimensionamento) deve tenere conto della dimensione originale.
Nessuno di questi è molto divertente, anche se il primo sembra più semplice. I diagrammisono particolarmente difficili da questo punto di vista.
Tuttavia, ho un hack che fa probabilmente quello che si vuole:
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.plot(x1, y1, 'o', label='first', markersize=np.sqrt(20.), c='b')
plt.plot(x2, y2, 'o', label='second', markersize=np.sqrt(35.), c='r')
# Plot legend.
lgnd = plt.legend(loc="lower left", numpoints=1, fontsize=10)
#change the marker size manually for both lines
lgnd.legendHandles[0]._legmarker.set_markersize(6)
lgnd.legendHandles[1]._legmarker.set_markersize(6)
plt.show()
Questo dà:

che sembra essere quello che si voleva.
I cambiamenti:
scatter
cambiato in un plot
, che cambia la scala marcatore (da qui il sqrt
) e rende impossibile usare cambiare dimensioni marcatore (se era destinato)
- la dimensione marcatore modificata manualmente per essere 6 punti per entrambi i marcatori nella leggenda
Come si può vedere, questo utilizza le proprietà di sottolineatura nascosti (_legmarker
) ed è bug-brutto. Potrebbe subentrare a qualsiasi aggiornamento in matplotlib
.
Aggiornamento
Haa, ho trovato. Una migliore trucco:
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.
lgnd = plt.legend(loc="lower left", scatterpoints=1, fontsize=10)
lgnd.legendHandles[0]._sizes = [30]
lgnd.legendHandles[1]._sizes = [30]
plt.show()
Ora il _sizes
(un altro sottolineano proprietà) fa il trucco. Non c'è bisogno di toccare la fonte, anche se questo è piuttosto un trucco. Ma ora puoi utilizzare tutte le offerte scatter
.

blu si suppone che sia più piccolo, ma dovrebbe essere semplice da risolvere , +1 – Aprillion
Sorprendente risposta DrV! Scusa se non ho commentato prima, pensavo di averlo ma a quanto pare non ho mai inviato il cmmt. – Gabriel
Volevo solo sottolineare che il secondo hack non funziona più, almeno per me ('python 3.5',' matplotlib 1.5.1'). Forse hanno cambiato qualcosa nel codice di 'matplotlib'. Il primo però funziona, grazie mille per quello. –