Changeset 5319


Ignore:
Timestamp:
Aug 6, 2022 10:06:14 PM (2 months ago)
Author:
vondreele
Message:

fixs & improvements to cluster analysis

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIdataGUI.py

    r5318 r5319  
    57005700        if not Id:
    57015701            Id = self.GPXtree.AppendItem(self.root,text='Cluster Analysis')
    5702             ClustDict = {'Files':[],'Method':'correlation','Limits':[],'DataMatrix':[],
     5702            ClustDict = {'Files':[],'Method':'correlation','Limits':[0.,100.],'DataMatrix':[],'plots':'All',
    57035703                'LinkMethod':'average','Opt Order':False,'ConDistMat':[],'NumClust':2,'codes':None}
    57045704            self.GPXtree.SetItemPyData(Id,ClustDict)
  • trunk/GSASIIplot.py

    r5318 r5319  
    1156811568#### Plot Cluster Analysis ####################################################
    1156911569
    11570 def PlotDendogram(G2frame,CLuDict,CLuZ,newPlot=True):
     11570# def PlotDendogram(G2frame,CLuDict,CLuZ,newPlot=True):
    1157111571   
    11572     import scipy.cluster.hierarchy as SCH
    11573     global Plot
    11574     def OnMotion(event):
    11575         xpos = event.xdata
    11576         if xpos:                                        #avoid out of frame mouse position
    11577             ypos = event.ydata
    11578             SetCursor(Page)
    11579             try:
    11580                 G2frame.G2plotNB.status.SetStatusText('X =%9.3f %s =%9.3g'%(xpos,Title,ypos),1)                   
    11581             except TypeError:
    11582                 G2frame.G2plotNB.status.SetStatusText('Select '+Title+' pattern first',1)
    11583     xylim = []
    11584     Title = 'Cluster dendogram'
    11585     new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab(Title,'mpl')
    11586     if not new:
    11587         if not newPlot:
    11588             xylim = copy.copy(lim)
    11589     else:
    11590         newPlot = True
    11591         Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     11572#     import scipy.cluster.hierarchy as SCH
     11573#     global Plot
     11574#     def OnMotion(event):
     11575#         xpos = event.xdata
     11576#         if xpos:                                        #avoid out of frame mouse position
     11577#             ypos = event.ydata
     11578#             SetCursor(Page)
     11579#             try:
     11580#                 G2frame.G2plotNB.status.SetStatusText('X =%9.3f %s =%9.3g'%(xpos,Title,ypos),1)                   
     11581#             except TypeError:
     11582#                 G2frame.G2plotNB.status.SetStatusText('Select '+Title+' pattern first',1)
     11583#     xylim = []
     11584#     Title = 'Cluster dendogram'
     11585#     new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab(Title,'mpl')
     11586#     if not new:
     11587#         if not newPlot:
     11588#             xylim = copy.copy(lim)
     11589#     else:
     11590#         newPlot = True
     11591#         Page.canvas.mpl_connect('motion_notify_event', OnMotion)
    1159211592   
    11593     Page.Choice = None
    11594     G2frame.G2plotNB.status.DestroyChildren() #get rid of special stuff on status bar
    11595     Plot.set_title('%s %s'%(CLuDict['LinkMethod'],Title))
    11596     Plot.set_xlabel(r''+CLuDict['Method']+' distance',fontsize=14)
    11597     Plot.set_ylabel(r''+'data set no.',fontsize=14)
     11593#     Page.Choice = None
     11594#     G2frame.G2plotNB.status.DestroyChildren() #get rid of special stuff on status bar
     11595#     Plot.set_title('%s %s'%(CLuDict['LinkMethod'],Title))
     11596#     Plot.set_xlabel(r''+CLuDict['Method']+' distance',fontsize=14)
     11597#     Plot.set_ylabel(r''+'data set no.',fontsize=14)
    1159811598   
    11599     CLR = SCH.dendrogram(CLuZ,orientation='right',ax=Plot)
    11600 
    11601     if not newPlot:
    11602         Page.toolbar.push_current()
    11603         Plot.set_xlim(xylim[0])
    11604         Plot.set_ylim(xylim[1])
    11605         Page.toolbar.push_current()
    11606         Page.ToolBarDraw()
    11607     else:
    11608         Page.canvas.draw()
     11599#     CLR = SCH.dendrogram(CLuZ,orientation='right',ax=Plot)
     11600
     11601#     if not newPlot:
     11602#         Page.toolbar.push_current()
     11603#         Plot.set_xlim(xylim[0])
     11604#         Plot.set_ylim(xylim[1])
     11605#         Page.toolbar.push_current()
     11606#         Page.ToolBarDraw()
     11607#     else:
     11608#         Page.canvas.draw()
    1160911609
    1161011610def PlotClusterXYZ(G2frame,YM,XYZ,CLuDict,Title='',PlotName=None):
     
    1162811628        ind = event.ind
    1162911629        print(CLuDict['Files'][ind[0]])
    11630    
    11631     Colors = ['xkcd:blue','xkcd:red','xkcd:green','xkcd:cyan','xkcd:magenta','xkcd:black',
    11632         'xkcd:pink','xkcd:brown','xkcd:teal','xkcd:orange','xkcd:grey','xkcd:violet',]
     11630           
     11631    Colors = ['xkcd:blue','xkcd:red','xkcd:green','xkcd:cyan',
     11632              'xkcd:magenta','xkcd:black','xkcd:pink','xkcd:brown',
     11633              'xkcd:teal','xkcd:orange','xkcd:grey','xkcd:violet',
     11634              'xkcd:aqua','xkcd:blueberry','xkcd:bordeaux'] #need 15 colors!
    1163311635    G2frame.G2plotNB.Delete(PlotName)       #A cluge: to avoid AccessExceptions on replot
    11634     new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab(PlotName,'mpl')
    11635     Plot.set_visible(False)         #hide old plot frame, will get replaced below
     11636    if CLuDict['plots'] == '3D PCA':
     11637        new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab(PlotName,'3d')
     11638    else:
     11639        new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab(PlotName,'mpl')
     11640    Plot.set_visible(True)
    1163611641    if new:
    1163711642        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     
    1164211647       
    1164311648    Imin = np.min(YM)
    11644     Imax = np.max(YM)           
    11645     if CLuDict['CLuZ'] is not None:
    11646         gs = mpl.gridspec.GridSpec(2,2,figure=Page.figure)
    11647         ax1 = Page.figure.add_subplot(gs[0,0])
    11648         ax2 = Page.figure.add_subplot(gs[1,1],projection='3d')
    11649         ax3 = Page.figure.add_subplot(gs[0,1])
    11650         ax4 = Page.figure.add_subplot(gs[1,0])
    11651     else:
    11652         ax1 = Page.figure.add_subplot(211)
    11653         ax2 = Page.figure.add_subplot(212,projection='3d')
    11654         Page.figure.tight_layout()
    11655     Page.ImgObj = ax1.imshow(YM,interpolation='nearest',vmin=Imin,vmax=Imax,origin='lower')
    11656     cax = inset_axes(ax1,width="5%",height="100%",loc='lower left',bbox_to_anchor=(1.05, 0., 1, 1),
    11657         bbox_transform=ax1.transAxes,borderpad=0)
    11658     Page.figure.colorbar(Page.ImgObj, cax=cax)
    11659     if CLuDict['codes'] is not None:
    11660         ax2.scatter(XYZ[0],XYZ[1],XYZ[2],color=[Colors[code] for code in CLuDict['codes']],picker=True)
    11661     else:
    11662         ax2.scatter(XYZ[0],XYZ[1],XYZ[2],color=Colors[0],picker=True)
    11663     ax1.set_title(Title+' distances')
    11664     ax1.set_xlabel('Data set',fontsize=12)
    11665     ax1.set_ylabel('Data set',fontsize=12)
    11666     ax2.set_xlabel('PCA axis-1',fontsize=12)
    11667     ax2.set_ylabel('PCA axis-2',fontsize=12)
    11668     ax2.set_zlabel('PCA axis-3',fontsize=12)
    11669     if CLuDict['CLuZ'] is not None:
    11670         CLR = SCH.dendrogram(CLuDict['CLuZ'],orientation='right',ax=ax3)
    11671         ax3.set_title('%s %s'%(CLuDict['LinkMethod'],Title))
    11672         ax3.set_xlabel(r''+'data set no.',fontsize=12)
    11673         ax3.set_ylabel(r''+CLuDict['Method']+' distance',fontsize=12)
    11674         ax4.plot(100.*CLuDict['PCA'][:10]/np.sum(CLuDict['PCA']))
    11675         ax4.set_xlabel('PCA index',fontsize=12)
    11676         ax4.set_ylabel('% of total',fontsize=12)
     11649    Imax = np.max(YM)
     11650    if CLuDict['plots'] == 'Distances':
     11651        Page.ImgObj = Plot.imshow(YM,interpolation='nearest',vmin=Imin,vmax=Imax,origin='lower')
     11652        cax = inset_axes(Plot,width="5%",height="100%",loc='lower left',bbox_to_anchor=(1.05, 0., 1, 1),
     11653            bbox_transform=Plot.transAxes,borderpad=0)
     11654        Page.figure.colorbar(Page.ImgObj, cax=cax)
     11655        Plot.set_title(Title+' distances')
     11656        Plot.set_xlabel('Data set',fontsize=12)
     11657        Plot.set_ylabel('Data set',fontsize=12)
     11658    elif CLuDict['plots'] == 'Dendogram':
     11659        CLR = SCH.dendrogram(CLuDict['CLuZ'],orientation='right',ax=Plot)
     11660        Plot.set_title('%s %s'%(CLuDict['LinkMethod'],Title))
     11661        Plot.set_xlabel(r''+'data set no.',fontsize=12)
     11662        Plot.set_ylabel(r''+CLuDict['Method']+' distance',fontsize=12)
     11663    elif CLuDict['plots'] == '3D PCA':
     11664        if CLuDict['codes'] is not None:
     11665            Plot.scatter(XYZ[0],XYZ[1],XYZ[2],color=[Colors[code] for code in CLuDict['codes']],picker=True)
     11666        else:
     11667            Plot.scatter(XYZ[0],XYZ[1],XYZ[2],color=Colors[0],picker=True)
     11668        Plot.set_xlabel('PCA axis-1',fontsize=12)
     11669        Plot.set_ylabel('PCA axis-2',fontsize=12)
     11670        Plot.set_zlabel('PCA axis-3',fontsize=12)
     11671    else:         
     11672        Plot.set_visible(False)         #hide old plot frame, will get replaced below
     11673        if CLuDict['CLuZ'] is not None:
     11674            gs = mpl.gridspec.GridSpec(2,2,figure=Page.figure)
     11675            ax1 = Page.figure.add_subplot(gs[0,0])
     11676            ax2 = Page.figure.add_subplot(gs[1,1],projection='3d')
     11677            ax3 = Page.figure.add_subplot(gs[0,1])
     11678            ax4 = Page.figure.add_subplot(gs[1,0])
     11679        else:
     11680            ax1 = Page.figure.add_subplot(211)
     11681            ax2 = Page.figure.add_subplot(212,projection='3d')
     11682            Page.figure.tight_layout()           
     11683        Page.ImgObj = ax1.imshow(YM,interpolation='nearest',vmin=Imin,vmax=Imax,origin='lower')
     11684        cax = inset_axes(ax1,width="5%",height="100%",loc='lower left',bbox_to_anchor=(1.05, 0., 1, 1),
     11685            bbox_transform=ax1.transAxes,borderpad=0)
     11686        Page.figure.colorbar(Page.ImgObj, cax=cax)
     11687        ax1.set_title(Title+' distances')
     11688        ax1.set_xlabel('Data set',fontsize=12)
     11689        ax1.set_ylabel('Data set',fontsize=12)
     11690        if CLuDict['codes'] is not None:
     11691            ax2.scatter(XYZ[0],XYZ[1],XYZ[2],color=[Colors[code] for code in CLuDict['codes']],picker=True)
     11692        else:
     11693            ax2.scatter(XYZ[0],XYZ[1],XYZ[2],color=Colors[0],picker=True)
     11694        ax2.set_xlabel('PCA axis-1',fontsize=12)
     11695        ax2.set_ylabel('PCA axis-2',fontsize=12)
     11696        ax2.set_zlabel('PCA axis-3',fontsize=12)
     11697        if CLuDict['CLuZ'] is not None:
     11698            CLR = SCH.dendrogram(CLuDict['CLuZ'],orientation='right',ax=ax3)
     11699            ax3.set_title('%s %s'%(CLuDict['LinkMethod'],Title))
     11700            ax3.set_xlabel(r''+'data set no.',fontsize=12)
     11701            ax3.set_ylabel(r''+CLuDict['Method']+' distance',fontsize=12)
     11702            ax4.plot(100.*CLuDict['PCA'][:10]/np.sum(CLuDict['PCA']))
     11703            ax4.set_xlabel('PCA index',fontsize=12)
     11704            ax4.set_ylabel('% of total',fontsize=12)
    1167711705    Page.canvas.draw()
    1167811706       
  • trunk/GSASIIseqGUI.py

    r5318 r5319  
    15791579                param: data dict: Cluster analysis info
    15801580                '''
    1581                 limits = [0.,1000.0]
     1581                limits = [0.,1.e6]
    15821582                for name in names:
    15831583                    item = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,name)
     
    16211621                ClusData['CLuZ'] = None
    16221622                ClusData['codes'] = None
     1623                ClusData['plots'] = 'All'
    16231624               
    16241625            dlg.Destroy()
     
    17901791        kmeanssizer.Add(compute)
    17911792        return kmeanssizer
    1792            
     1793   
     1794    def OnPlotSel(event):
     1795        ClusData['plots'] = plotsel.GetValue()
     1796        G2plt.PlotClusterXYZ(G2frame,YM,XYZ,ClusData,PlotName=ClusData['Method'],Title=ClusData['Method'])
     1797           
     1798    #patch
     1799    ClusData['plots'] = ClusData.get('plots','All')
    17931800    G2frame.dataWindow.ClearData()
    17941801    bigSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    18141821
    18151822            G2G.HorizontalLine(mainSizer,G2frame.dataWindow)
    1816             mainSizer.Add(wx.StaticText(G2frame.dataWindow,label=' Distance Cluster Analysis:'))
     1823            mainSizer.Add(wx.StaticText(G2frame.dataWindow,label='Distance Cluster Analysis:'))
    18171824            mainSizer.Add(MethodSizer())
    18181825            if len(ClusData['ConDistMat']):
     
    18231830                S = np.diag(s)
    18241831                XYZ = np.dot(S[:3,:3],VT[:3,:])
    1825                 if ClusData['CLuZ'] is not None:
    1826                     G2plt.PlotClusterXYZ(G2frame,YM,XYZ,ClusData,PlotName=ClusData['Method'],Title=ClusData['Method'])
    1827                 else:   
    1828                     G2plt.PlotClusterXYZ(G2frame,YM,XYZ,ClusData,PlotName=ClusData['Method'],Title=ClusData['Method'])
     1832                G2plt.PlotClusterXYZ(G2frame,YM,XYZ,ClusData,PlotName=ClusData['Method'],Title=ClusData['Method'])
    18291833                G2G.HorizontalLine(mainSizer,G2frame.dataWindow)
    18301834                mainSizer.Add(wx.StaticText(G2frame.dataWindow,label='Hierarchical Cluster Analysis:'))
     
    18361840                if ClusData['codes'] is not None:
    18371841                    kmeansres = wx.BoxSizer(wx.HORIZONTAL)
    1838                     # Bsumsq = np.zeros(ClusData['NumClust'])
    1839                     # Tsumsq = 0.0
    1840                     # for i in range(len(ClusData['Files'])):
    1841                     #     Bsumsq[ClusData['codes'][i]] += ClusData['dists'][i]**2
    1842                     #     Tsumsq += ClusData['dists'][i]**2
    18431842                    kmeansres.Add(wx.StaticText(G2frame.dataWindow,label='K-means ave. dist = %.2f'%np.mean(ClusData['dists'])))
    18441843                    mainSizer.Add(kmeansres)
     1844            G2G.HorizontalLine(mainSizer,G2frame.dataWindow)
     1845            plotSizer = wx.BoxSizer(wx.HORIZONTAL)
     1846            plotSizer.Add(wx.StaticText(G2frame.dataWindow,label='Plot selection: '),0,WACV)
     1847            choice = ['All','Distances','Dendogram','3D PCA',]
     1848            plotsel = wx.ComboBox(G2frame.dataWindow,choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1849            plotsel.SetValue(str(ClusData['plots']))
     1850            plotsel.Bind(wx.EVT_COMBOBOX,OnPlotSel)
     1851            plotSizer.Add(plotsel,0,WACV)
     1852            mainSizer.Add(plotSizer)
     1853           
     1854           
    18451855           
    18461856           
Note: See TracChangeset for help on using the changeset viewer.