2017-04-03 155 views
0

下面是使用matplotlib的scatterplot生成附加圖像的少量代碼。 Output image from code.Matplotlib散點圖大小圖例

我想獲得一個顯示幾個點的大小和相應的「z值」的「圖例」。

自己建造它的缺點,有沒有像這樣的東西?與顏色條相似的「尺寸」?

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') 

回答

1

要你得到一個傳奇,你需要至少一個數據點打電話scatter時將關鍵字label。一種方法是從數據中選擇3個有代表性的點,然後再用標籤將它們添加到圖中。

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

的偉大工程。謝謝! –