2017-01-23 5 views
0

I ax.scatter(x,y,c=color, s=size, marker='*', label="mylabel") bin mit 4 Symbolen in einem Streudiagramm plotten (Marker sind ',', 'o', '*' und '^'), die jeweils mit unterschiedlichen Größen und Farben.Matplotlib Streudiagramm Legende, als separates Bild

Ich habe versucht, ax.legend() aufrufen, und obwohl ich die erwarteten Label-Informationen erhalten, keine der Markierungen in der Legende angezeigt. Ich habe versucht, eine Reihe von Varianten zu verwenden, die hier ohne Erfolg erklärt wurden: http://matplotlib.org/users/legend_guide.html

Darüber hinaus brauche ich letztendlich meine Legende in einem komplett separaten Bild. Ich habe versucht: Get legend as a separate picture in Matplotlib

und

https://pymorton.wordpress.com/2016/04/05/creating-separate-legend-figure-with-matplotlib/

aber nicht in der Lage gewesen, die Marker angezeigt werden soll. Jeder Rat würde geschätzt werden!

Hier ist mein Plotten Code:

import matplotlib.pyplot as plt 
import matplotlib.colors as colors 
import numpy as np 
from scipy import stats 

lat = np.random.randint(-60.5, high=60.5, size=257087) 
lon = np.random.randint(-179.95, high=180, size=257087) 
thiscategory = np.random.randint(12, 60, size=257087) 

percRange = np.arange(100,40,-1) 


#Rank all values 
allPercent=stats.rankdata(thiscategory)/len(thiscategory) 

h=np.where(allPercent > 0.9) 
hl=np.where((allPercent <= 0.9) & (allPercent > 0.8)) 
mh=np.where((allPercent <= 0.8) & (allPercent > 0.7)) 
ml=np.where((allPercent <= 0.7) & (allPercent > 0.6)) 
l=np.where(allPercent <= 0.6) 

allPercent[h]=0 
allPercent[hl]=0.25 
allPercent[mh]=0.5 
allPercent[ml]=0.75 
allPercent[l]=1 


fig = plt.figure(dpi=400) 
ax=fig.add_axes([0,0,1,1]) #position: left, bottom, width, height 
ax.set_axis_off() 
fig.patch.set_facecolor('none') 

latcorners = ([-90.0,90.0]) 
loncorners = ([-180.0,180.0]) 


rgba_low=colors.hex2color('#e0ffff') #224-255-255 Light Cyan 
rgba_ml=colors.hex2color('#afeeee') #175-238-238 Pale Turquoise 
rgba_mh=colors.hex2color('#ffff00') #Yellow 
rgba_hl=colors.hex2color('#ffa500') #Orange 
rgba_high=colors.hex2color('#f8f8ff') #ghost white 

m = Basemap(projection='cyl',llcrnrlat=latcorners[0],urcrnrlat=latcorners[1],llcrnrlon=loncorners[0],urcrnrlon=loncorners[1])      
# Draw on map. 
x, y = m(lon, lat) 



ax.scatter(x[ml],y[ml], c=rgba_ml, s=3, marker=',',edgecolor='none', alpha=0.4, label=str(mlmin)+" to "+str(mlmax)) 
ax.scatter(x[mh],y[mh], c=rgba_mh, s=5, marker='o', edgecolor='none', alpha=0.5, label=str(mhmin)+" to "+str(mhmax)) 
ax.scatter(x[hl],y[hl], c=rgba_hl, s=10, marker='*',edgecolor='none', alpha=0.6, label=str(hlmin)+" to "+str(hlmax)) 
ax.scatter(x[h],y[h], c=rgba_high, s=20, marker='^', edgecolor='none',alpha=0.7, label=str(hmin)+" to "+str(hmax)) 

ax.set_xlim([-180,180]) 
ax.set_ylim([-90,90]) 

#this is where my legend calls were going, but since I want them in a new plot it doesn't seem appropriate 


fig.savefig('testfig.jpg', bbox_inches='tight', transparent=True, pad_inches=0) 

* bearbeitet Beispielcode zu zeigen.

+1

Das ist so, als würde man jemanden anrufen und sagen: "Mein Computer funktioniert nicht". Es gibt einfach zu viele mögliche Dinge, die schief gehen könnten. Daher müssen Sie den Code, den Sie verwendet haben, veröffentlichen, um Hilfe zu diesem Problem zu erhalten. Es wird erwartet, dass die Art und Weise, wie du es beschreibst, funktioniert, daher muss irgendwo im Code ein Problem auftreten, mit dem wir dir nur helfen können, wenn du ein [MCVE] bekommst. – ImportanceOfBeingErnest

+0

Ich wollte dies offen halten für den Fall, dass es eine Scatter-Plot-Eigenschaft gab, die mir nicht bekannt war. Ich werde bearbeiten, um den Plotcode zu veröffentlichen. – mofs

+1

Wenn ich 'ax.legend()' hinzufüge, wird die Legende inklusive der Marker angezeigt. Da Sie keinen der in [der verknüpften Frage] (http://stackoverflow.com/questions/4534480/get-legend-as-a-separate-picture-in-matplotlib) genannten Befehle zum Erstellen einer Legende in anwenden eine separate Datei, warum erwartest du das? Denken Sie abschließend darüber nach, was die Wörter minimal, vollständig und verifizierbar in [MCVE] bedeuten! – ImportanceOfBeingErnest

Antwort

1

Hier ist, was ich gefunden: Ich musste den Code ändern, den ich gefunden habe, um eine Figur Anruf enthalten. Nach dem Auftragen der Streuung (ax.scatter) I genannt:

handles,labels = ax.get_legend_handles_labels() 

Nachdem das Hauptstück Plotten und Schließen der Figur I eine neue Figur genannt:

fig_legend = plt.figure(figsize=(2,2)) 
axi = fig_legend.add_subplot(111)    
fig_legend.legend(handles, labels, loc='center', scatterpoints = 1) 
axi.xaxis.set_visible(False) 
axi.yaxis.set_visible(False) 
fig_legend.canvas.draw() 
fig_legend.show() 

Die endgültigen Ergebnisse enthält zwei schwarze Ränder, aber Es ist ein separates Bild und hat eine einzelne Instanz des Scatter-Symbols in der richtigen Farbe. legend image example here