Hi,

While moving from Matlab to Numpy/Scipy/Matplotlib I need sometimes to work 
with Matlab figures. It would be nice if we could load Matlab figures in 
Python, extract the data and some basic parameters of how it was looking in 
Matlab and create its "clone" in matplotlib. At present the Matlab figures are 
MAT files and in the near future it will be HDF5, both formats are loadable. 
However, I have not found any reference for such attempts to load and parse the 
FIG files. As a beginner I find it difficult to write a large piece of code. 
However, if there are other  interested users that can cooperate on such, I'd 
gladly contribute some hours for this task. Meanwhile, to show the 
proof-of-concept attempt is attached below. All your useful comments and 
suggestions are very welcome. 

Thank you,
Alex 

#------------ loadfig.py ---------------------- #
""" Loadfig loads simple Matlab figures as MAT files and plots the lines using 
matplotlib

"""
import numpy as np
from scipy.io import loadmat
import matplotlib.pyplot as plt


def lowest_order(d):
        """ 
        lowestsc_order(hgstruct) finds the handle of axes (i.e. children of 
figure handles, etc.)
        
        """
        while not 'graph2d.lineseries' in d['type']:
                d = d['children'][0][0]
        return d
        
def get_data(d):
        """ 
        get_data(hgstruct) extracts XData, YData, Color and Marker of each line 
in the 
        given axis
        
        Parameters
        ----------
        hgstruct : structure 
                obtained from lowest_order(loadmat('matlab.fig'))
        
        """
        xd,yd,dispname,marker,colors = [],[],[],[],[]
        for i in d:
                if i['type'] == 'graph2d.lineseries':
                        xd.append(i['properties'][0][0]['XData'][0][0])
                        yd.append(i['properties'][0][0]['YData'][0][0])
                        
dispname.append(i['properties'][0][0]['DisplayName'][0][0])
                        marker.append(i['properties'][0][0]['Marker'][0][0])
                        colors.append(i['properties'][0][0]['Color'][0][0])
                        
        return 
np.asarray(xd),np.asarray(yd),dispname,np.asarray(marker).astype('S1'),colors


def plot_data(xd,yd,dispname=None,marker=None,colors=None):
        """
        plot_data(xd,yd,dispname=None,marker=None,colors=None)
        
        plots the data sets extracted by 
get_data(lowest_order(loadmat('matlab.fig')))  
        
        Parameters
        ----------
                xd,yd : array_like
                        data arrays 
                dispname : array of strings 
                        to be used in legend, optional
                marker : array of characters
                        markers, e.g. ['o','x'], optional
                colors : array of color sets 
                        in RGB, e.g. [[0,0,1],[1,0,0]], optional
                        
                
        """
        for i,n in enumerate(xd):
                
plt.plot(xd[i].T,yd[i].T,color=tuple(colors[i]),marker=marker[i],linewidth=0)
                
        plt.legend(dispname)
        plt.show()

def main(filename):
        """
        main(filename) 
        
        loads the filename (with the extension .fig) which is Matlab figure. At 
the moment only
        simple 2D lines are supported. 
        
        Examples
        -------
        >>> loadfig('matlab.fig') # is equivalent to:
        
        >>> d = loadmat(filename)
        >>> d = d['hgS_070000']
        >>> xd,yd,dispname,marker,colors = get_data(lowest_order(d))
        >>> plot_data(xd,yd,dispname,marker,colors)
        
        """
        d = loadmat(filename)
        # ver 7.2 or lower:
        d = d['hgS_070000']
        xd,yd,dispname,marker,colors = get_data(lowest_order(d))
        plot_data(xd,yd,dispname,marker,colors)


if __name__ == "__main__":
    import sys
    import os
    try:
        filename = sys.argv[1]
        main(filename)
    except:
        print("Wrong file")
# ----------------------------- EOF loadfig.py --------------------------- # 

Alex Liberzon
Turbulence Structure Laboratory [http://www.eng.tau.ac.il/efdl]
School of Mechanical Engineering
Tel Aviv University
Ramat Aviv 69978
Israel
Tel: +972-3-640-8928
Lab: +972-3-640-6860 (telefax)
E-mail: alex...@eng.tau.ac.il





------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand 
malware threats, the impact they can have on your business, and how you 
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to