2017-04-03 2 views
0

Unten ist eine kleine Menge Code, der das angehängte Bild mit dem Streudiagramm von Matplotlib erzeugt. Output image from code.Matplotlib Scatterplot Point Size Legende

Ich versuche eine "Legende" zu bekommen, die die Größe mehrerer Punkte und den entsprechenden "Z-Wert" anzeigt.

Kurz, es selbst zu bauen, gibt es so etwas? Eine "Größen" Analogie zur Farbleiste?

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(8,6)) 
inset = fig.add_subplot(111) 

np.random.seed(0) # so the image is reproducible 
x1 = np.random.rand(30) 
y1 = np.random.rand(30) 
z1 = np.random.rand(30) 


axis = inset.scatter(x1,y1,s=z1*100,c=z1,vmin=0,vmax=1) 

inset.set_xlabel("X axis") 
inset.set_ylabel("Y axis") 

cbar = fig.colorbar(axis,ticks=[0,0.5,1]) 
cbar.ax.set_yticklabels(["Low","Medium","High"]) 

plt.savefig('scatterplot-zscale.png',bbox_inches='tight') 

Antwort

1

Um eine Legende zu erhalten, müssen Sie das Schlüsselwort label passieren, wenn scatter auf mindestens einen Datenpunkt aufrufen. Eine Möglichkeit besteht darin, aus Ihren Daten 3 repräsentative Punkte auszuwählen und sie dann erneut mit Beschriftungen zum Plot hinzuzufügen.

import matplotlib.pyplot as plt 
import numpy as np 

np.random.seed(0) # so the image is reproducible 
x1 = np.random.rand(30) 
y1 = np.random.rand(30) 
z1 = np.random.rand(30) 

fig = plt.figure(figsize=(8,6)) 
inset = fig.add_subplot(111) 
# i prefer no outlines on the dots, so edgecolors='none' 
axis = inset.scatter(x1,y1,s=z1*100,c=z1,vmin=0,vmax=1,edgecolors='none') 

inset.set_xlabel("X axis") 
inset.set_ylabel("Y axis") 

cbar = fig.colorbar(axis,ticks=[0,0.5,1]) 
cbar.ax.set_yticklabels(["Low","Medium","High"]) 

# here we step over the sorted data into 4 or 5 strides and select the 
# last 3 steps as a representative sample, this only works if your 
# data is fairly uniformly distributed 
legend_sizes = np.sort(z1)[::len(z1)//4][-3:] 

# get the indices for each of the legend sizes 
indices = [np.where(z1==v)[0][0] for v in legend_sizes] 

# plot each point again, and its value as a label 
for i in indices: 
    inset.scatter(x1[i],y1[i],s=100*z1[i],c=z1[i], vmin=0,vmax=1,edgecolors='none', 
        label='{:.2f}'.format(z1[i])) 
# add the legend 
inset.legend(scatterpoints=1) 

enter image description here

+0

Arbeiten groß. Vielen Dank! –