def add_cluster_centroids_to_axes(dictdata,ax,annotate=True,n_clusters=None,nodiamonds=False,write_to_file=None,k_means=False,fontsize_clusterlabel=14,**kwargs): from ClusterPoints import get_clusterpoints print(n_clusters) if n_clusters is not None: print(n_clusters) centroids , sizedict, sizedict_normalized,labels,n_clusters = get_clusterpoints(dictdata,n_clusters=n_clusters,k_means=k_means) else: print(n_clusters) centroids , sizedict, sizedict_normalized,labels,n_clusters = get_clusterpoints(dictdata,k_means=k_means) if not nodiamonds: im2 = ax.scatter(centroids[:, 0], centroids[:, 1],centroids[:,2],marker='o', s=110, linewidths=3, color='black',alpha=1.0) if annotate: i=0 for k in sizedict_normalized: print("k ",k,sizedict_normalized[k]) #print("k centroids ",k,centroids[k,:]) if k<0: continue #print(sizedict_normalized[k]) label = "{:0.2f}".format(sizedict_normalized[k]) label2 = "{:.1f},\n{:.1f},\n{:.1f}".format(centroids[k, 0], centroids[k, 1],centroids[k,2]) label3 = sizedict[k] #ax.text(centroids[k, 0]+0.2+0.01*i, centroids[k, 1]+0.2,centroids[k,2]+0.2,label,fontsize=11) #ax.text(centroids[k, 0]+0.23, centroids[k, 1]+0.23,centroids[k,2]+0.45,label2,fontsize=8) ax.text(centroids[k, 0]+0.23, centroids[k, 1]+0.23,centroids[k,2]+0.4,label3,fontsize=fontsize_clusterlabel) i+=1
def clusters_to_dict(dictdata,n_clusters=None): from ClusterPoints import get_clusterpoints if n_clusters is not None: centroids , sizedict, sizedict_normalized = get_clusterpoints(dictdata,n_clusters=n_clusters) else: centroids , sizedict, sizedict_normalized = get_clusterpoints(dictdata) cdict={} for k in sizedict_normalized: cdict['centroid_id']=k cdict['dimensions']=centroids.shape[1] cdict['n_clusters']=centroids.shape[0] cdict['center']=centroids[k,:] cdict['size']=sizedict[k] cdict['size_norm']=sizedict_normalized[k] cdict['xfield']=info['xfield'] cdict['yfield']=info['yfield'] cdict['zfield']=info['zfield'] return cdict
def plot3d_slice_topN(collection,keys=None,outfile=None,show=False,cluster=False,color_field='cfield',cmap_field='cfield',dim3d=True,dim2d=False,topNs=[200],use_topN=True,**kwargs): figsize = (5*len(topNs),4*len(collection)) fig = plt.figure(figsize=figsize) markers = ['o', 'o','o'] print("keys",keys) if topNs is None: topNs = [200]#10% count=1 cols = len(topNs) rows = len(collection) vmin = -40 vmax = -25 for i,org_dictdata in enumerate(collection): for topN in topNs: sorteddict = sortdict_by_field(org_dictdata) if not dim2d: ax = fig.add_subplot(rows,cols,count,projection='3d') im1 = ax.scatter( sorteddict['xfield'][:topN] , sorteddict['yfield'][:topN], sorteddict['zfield'][:topN],c=sorteddict[cmap_field][:topN] , cmap=plt.cm.RdPu_r,vmin=vmin, vmax=vmax, alpha=1.0, edgecolors='w',lw=0,s=25,marker=markers[i]) if cluster: sorteddict_mod={} for ckey in sorteddict: sorteddict_mod[ckey]={} sorteddict_mod[ckey]['vals'] = sorteddict[ckey][:topN] if topN>15: from ClusterPoints import get_clusterpoints centroid_clusters, counts_cluster,_,labels,dbscan_clusters = get_clusterpoints(sorteddict_mod,k_means=False) add_cluster_centroids_to_axes(sorteddict_mod,ax,annotate=True,n_clusters=3,nodiamonds=True) if not keys is None: setup_axes(ax,key=keys[i],ticksize=12,labelsize=10,view={'elev':17, 'azim':-37},view_abs=True,key_fontsize=15) else: setup_keys(ax,ticksize=15) label = '<{}'.format(topN) delta_ticks['substrate_ca_no_super_rmsd']=0.5 limits , ticks, limits_r, ticks_r = get_axes_ticks() ax.set_yticks(ticks_r["yfield"]) ax.set_xticks(ticks_r['xfield']) ax.set_zticks(ticks['zfield'][::2]) if info['xfield']=='substrate_ca_no_super_rmsd': print('setting new limits') ax.set_xticks(ticks['xfield']) ax.set(xlim = [2.0,0.0] , ylim = [6.5,2.5] ,zlim = limits['zfield']) ax.text(limits['xfield'][0]+0.5,6.5-0.3,limits['zfield'][1]-0.5,label,fontsize=14) ax.xaxis.set_rotate_label(True) ax.yaxis.set_rotate_label(True) count+=1 plt.tight_layout() if not outfile is None: plt.savefig(outfile,transparent=True,dpi=dpi[runtype]) if show: plt.show() plt.close()
def slice_and_cluster(sorteddict,thr,k_means=False,clus2d=False): topN = get_slice(sorteddict,thr) print(thr,topN) sorteddict_mod={} for ckey in sorteddict: print(ckey) sorteddict_mod[ckey]={} sorteddict_mod[ckey]['vals'] = sorteddict[ckey][:topN] #must do because of how i hav it setup :( NH if topN>15: from ClusterPoints import get_clusterpoints if k_means: #not tested for 2d option centroids , sizedict, sizedict_normalized, labels, distances= get_clusterpoints(sorteddict_mod,n_clusters=3,distances=True,k_means=k_means) return sort_clusters_by_field(sorteddict,centroids , sizedict, sizedict_normalized, labels, distances=distances) else: #listfromdf = np.array([ combined_df[labels_df[info['xfield']]] , combined_df[labels_df[info['yfield']]], combined_df[labels_df[info['zfield']]] ]) #print(listfromdf.shape) centroids , sizedict, sizedict_normalized,labels,n_clusters,core_samples_ = get_clusterpoints(sorteddict_mod,k_means=k_means,core_samples=True) return sort_clusters_by_field(sorteddict_mod,centroids , sizedict, sizedict_normalized, labels, core_samples=core_samples_,sortorder=['interaction_energy']) else: return None
def plot3d_slice_and_compare_n(collection,keys=None,n=3,thresholds=None,outfile=None,show=False,cluster=False,size=None,color_field='cfield',cmap_field='cfield',dim3d=True,dim2d=False,**kwargs): figsize = (12,4*len(collection)) if not size is None: figsize=size fig = plt.figure(figsize=figsize) markers = ['o', 'o','o'] print("keys",keys) if thresholds is None: thresholds=[-32,-30,-27] #sort threshold thresholds.sort(reverse=True) #least negative to most negative count=1 cols = len(thresholds) rows = len(collection) for i,org_dictdata in enumerate(collection): sorteddict = sortdict_by_field(org_dictdata) for j,thr in enumerate(thresholds): topN = get_slice(sorteddict,thr) print(thr,topN) vmax=-10 vmin=-35 if cmap_field=='z2field': vmax=3.0 vmin=0.4 if not dim2d: ax = fig.add_subplot(rows,cols,count,projection='3d') im1 = ax.scatter( sorteddict['xfield'][:topN] , sorteddict['yfield'][:topN], sorteddict['zfield'][:topN],c=sorteddict[cmap_field][:topN] , cmap=plt.cm.RdPu_r,vmin=vmin, vmax=vmax, alpha=1.0, edgecolors='w',lw=0,s=25,marker=markers[i]) if cluster: sorteddict_mod={} for ckey in sorteddict: sorteddict_mod[ckey]={} sorteddict_mod[ckey]['vals'] = sorteddict[ckey][:topN] #must do because of how i hav it setup :( NH if topN>15: from ClusterPoints import get_clusterpoints centroid_clusters, counts_cluster,_,labels,dbscan_clusters = get_clusterpoints(sorteddict_mod,k_means=False) print('DBSCAN', dbscan_clusters, counts_cluster,centroid_clusters) add_cluster_centroids_to_axes(sorteddict_mod,ax,annotate=True,n_clusters=3,nodiamonds=True) #max(dbscan_clusters-1,1) set_colors = plt.cm.rainbow(np.linspace(0,1,dbscan_clusters)) clusters = list(set(labels)) point_colors={} for ik,key in enumerate(clusters): point_colors[key] = set_colors[ik] colors = [point_colors[t] for t in labels] for ic,col in enumerate(colors): if labels[ic]==-1: colors[ic]='black' print(len(sorteddict['xfield'][:topN]),len(colors)) #im1 = ax.scatter( sorteddict['xfield'][:topN] , sorteddict['yfield'][:topN], sorteddict['zfield'][:topN],c=colors, alpha=1.0, edgecolors='w',lw=0,s=30,marker='o') if not keys is None: setup_axes(ax,key=keys[i],ticksize=12,labelsize=10,view={'elev':17, 'azim':-37},view_abs=True,key_fontsize=15) else: setup_keys(ax,ticksize=15) label = '<{}'.format(thr) delta_ticks['substrate_ca_no_super_rmsd']=0.5 limits , ticks, limits_r, ticks_r = get_axes_ticks() ax.set_yticks(ticks_r["yfield"]) ax.set_xticks(ticks_r['xfield']) ax.set_zticks(ticks['zfield'][::2]) if info['xfield']=='substrate_ca_no_super_rmsd': print('setting new limits') ax.set_xticks(ticks['xfield']) ax.set(xlim = [2.0,0.0] , ylim = [6.5,2.5] ,zlim = limits['zfield']) ax.text(limits['xfield'][0]+0.5,6.5-0.3,limits['zfield'][1]-0.5,label,fontsize=14) ax.xaxis.set_rotate_label(True) ax.yaxis.set_rotate_label(True) if dim2d: ax = fig.add_subplot(rows,cols,count) vmin=-40 vmax=-20 im1 = ax.scatter( sorteddict['yfield'][:topN], sorteddict['zfield'][:topN],c=sorteddict[cmap_field][:topN] , cmap=plt.cm.RdPu_r,vmin=vmin, vmax=vmax, alpha=1.0, edgecolors='w',lw=0,s=25,marker=markers[i]) if cluster: sorteddict_mod={} for ckey in sorteddict: sorteddict_mod[ckey]={} sorteddict_mod[ckey] = sorteddict[ckey][:topN] #must do because of how i hav it setup :( NH if topN >15: add_cluster_centroids_to_axes_from_list([sorteddict_mod['yfield'],sorteddict['zfield']],ax,annotate=True,n_clusters=3,nodiamonds=True) label = '<{}'.format(thr) limits , ticks, limits_r, ticks_r = get_axes_ticks() ax.set_yticks(ticks["zfield"][::2]) ax.set_xticks(ticks['yfield'][::2]) ax.set(xlim = limits['yfield'] ,ylim = limits['zfield']) ax.text(limits['yfield'][1]-1.5,limits['zfield'][1]-0.5,label,fontsize=20) ax.text(limits['yfield'][0]+0.1,limits['zfield'][1]-0.5,keys[i],fontsize=20) count+=1 plt.tight_layout() if not outfile is None: plt.savefig(outfile,transparent=True,dpi=dpi[runtype]) if show: plt.show() else: plt.show()