def density_contour_plot(figure,X,Y,color,XY_range=None,xlabel="",ylabel="",n_points=100,n_contours=10,smooth_factor=1.0,linewidth=1,marker_size=40.,alpha=1.0,label=""):
font = fm.FontProperties(family = 'Trebuchet', weight ='light')
figure.patch.set_facecolor('white')
axes = figure.add_subplot(111)
if XY_range is None:
XY_range = [[X.min(),X.max()],[Y.min(),Y.max()]]
range_x = np.linspace(XY_range[0][0],XY_range[0][1],n_points)
range_y = np.linspace(XY_range[1][0],XY_range[1][1],n_points)
xx, yy = np.meshgrid(range_x,range_y)
range_x_cr = (range_x - range_x.mean())/range_x.std()
range_y_cr = (range_y - range_y.mean())/range_y.std()
xx_cr, yy_cr = np.meshgrid(range_x_cr,range_y_cr)
def density_function(positions,radius=1,k=0.1):
def density_func(x,y):
points = np.array(positions.values())
if len((x+y).shape) == 1:
distances = np.power(np.power(x[np.newaxis] - points[:,0,np.newaxis],2) + np.power(y[np.newaxis] - points[:,1,np.newaxis],2),0.5)
elif len((x+y).shape) == 2:
distances = np.power(np.power(x[np.newaxis] - points[:,0,np.newaxis,np.newaxis],2) + np.power(y[np.newaxis] - points[:,1,np.newaxis,np.newaxis],2),0.5)
density_potential = 1./2. * (1. - np.tanh(k*(distances - radius)))
density = density_potential.sum(axis=0)
return density
return density_func
positions = dict(zip(range(len(X)),np.transpose([X,Y])))
positions_cr = dict(zip(range(len(X)),np.transpose([(X-range_x.mean())/range_x.std(),(Y-range_y.mean())/range_y.std()])))
# radius = np.sqrt((X.std() * Y.std()))
radius = 10.0/n_points
density_k = 100.*np.exp(-smooth_factor/2.)
data_density = density_function(positions_cr,radius,density_k)(xx_cr,yy_cr)
levels = np.linspace(0,data_density.max(),n_contours)
colors = np.array([(lev*color + (n_contours-1-lev)*np.ones(3))/(n_contours-1) for lev in xrange(n_contours)])
axes.scatter(X,Y,s=marker_size,c=color,linewidth=0,alpha=alpha/2.,label=label)
axes.contour(xx,yy,data_density,linewidths=linewidth,levels=levels,colors=colors,alpha=(alpha+1)/2.)
axes.set_xlim(*tuple(XY_range[0]))
axes.set_xlabel(xlabel,fontproperties=font, size=10, style='italic')
axes.set_xticklabels(axes.get_xticks(),fontproperties=font, size=12)
axes.set_ylim(*tuple(XY_range[1]))
axes.set_ylabel(ylabel, fontproperties=font, size=10, style='italic')
axes.set_yticklabels(axes.get_yticks(),fontproperties=font, size=12)
评论列表
文章目录