I totally agree with to general opinion that a command line tool would be 
beneficial.
I've written a simple mpl commandline plotter quite some time ago and use it 
frequently for
quick previews but also to create simple plots for presentations. It features 
some options to
modify the appearance just like GNU/graph.
If somebody wants to give it at try, I've attached the script.

br
Jakob



I was brain-storming yesterday and I wanted to test the waters to see
if people would find it useful.

Currently, GNU plotutils comes with command-line utilities such as
`graph` to create quick and dirty line plots like this:
http://www.gnu.org/software/gsl/manual/html_node/DWT-Examples.html. I
think even gnuplot might be similar.

How do people feel about perhaps adding a matplotlib version, mocking
the same calling signature as graph?

I think the most important question is: would it be useful?

#! /usr/bin/env python

import sys, os
import getopt
import matplotlib.pyplot as plt
import numpy as np

# PYTHON RPT File Plotter
# ~~~~~~~~~~~~~~~~~~~~~~~
# just add files to plot as arguments


usetext="""
Usage: rptplot [options...] input.rpt input2.rpt ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Possible options are:
  -t, --title           set title
  -x, --xlabel          set xlabel
  -y, --ylabel          set ylabel
  --xlim                set xlim as 'min,max'
  --ylim                set ylim as 'min,max'
  --size                set figure size
  -l                    set default legend (based on file name)
  -g, --nogrid          set no grid
  -p, --pdf             writes pdf instead of screen output
  -s, --scalefactor     set a scale factor for each argument
                        has to be a string with comma separated values.
                        e.g. -s '1.4, 4, 10'
  --scalenoiso          scale non-isotropic, additional scalefactor for y values
  --xshift              shift data in x for each argument
  --style               set the style for every argument
                        e.g. --style '-k, --g, :r'
  -a                    creates markers with a given distance for each argument
  -b, --lw              set linewidth for each argument
  -n                    skip non-isotropic note
  --legend              set a legend entry for each argument
                        has to be a string with comma separated values.
                        e.g. --legend 'Plot 1, Plot 2, Plot 3'
  --legloc              specify the legend location, default: 'best'
  -d                    copy rptscript to folder, for extended modification
  -h, --help            print this help message

Uses the matplotlib library as plotting tool. This library
has to be available. Default axes labels are Force and Displacement
"""
########################################
# Method definitions
############################################################

def usage():
    print usetext

def raw_string(s):
    ''' convert string to raw string '''
    if isinstance(s, str):
        s = s.encode('string-escape')
    elif isinstance(s, unicode):
        s = s.encode('unicode-escape')
    return s

############################################################
# Main program
############################################################

try:
    opts, args = getopt.getopt(sys.argv[1:], "ht:s:x:y:glpnda:b:", ["help", "title=","scalefactor=", "xlabel=", "ylabel=", "nogrid", "legend=", "pdf", "scalenoiso=", "style=", "legloc=", "xlim=", "ylim=", "lw=","size=", "xshift="]) 
except getopt.GetoptError, err:
    print str(err)
    usage()
    sys.exit(2)

#default scalefactor, scalelist
sf = 1
sl = [sf]*len(args)
sln = [sf]*len(args)
ll = False
ls = False
legloc='best'
pdf = False
style=[]
n = False
smooth = [False]*len(args)
xl, yl = [], []
lw = [1]*len(args)
xshift=[0]*len(args)

# create plot figure with default options
fig = plt.figure(1,(11.5,8.3))
#ax1 = plt.axes([0.10,0.10,0.8,0.8])
ax1 = fig.add_subplot(111)
plt.xlabel("Displacement")
plt.ylabel("Force")
plt.grid(True)

# use arguments
for o, a  in opts:
    # set title
    if o in ('-t','--title'): 
        plt.title(a)
    # set xlabel
    elif o in ('-x','--xlabel'): 
        plt.xlabel(a)
    # set ylabel
    elif o in ('-y','--ylabel'): 
        plt.ylabel(a)
    # set grid flag
    elif o in ('-g','--nogrid'): 
        plt.grid(False)
    # check pdf flag
    elif o in ('-p','--pdf'): 
        pdf = True
    # check and set xlim
    elif o in ('--xlim'): 
        xl = [float(i) for i in a.split(',')]
        if len(xl)==2:
            pass
        else:
            print 'Check number of entries! Need 2!'
            print 'Arguments: ' + str(args)
            usage()
            sys.exit(2)
    # check and set ylim
    elif o in ('--ylim'): 
        yl = [float(i) for i in a.split(',')]
        if len(yl)==2:
            pass
        else:
            print 'Check number of entries! Need 2!'
            print 'Arguments: ' + str(args)
            usage()
            sys.exit(2)
    # check and set scalefactor
    elif o in ('-s','--scalefactor'): 
        sl = [float(i) for i in a.split(',')]
        if len(sl)>=len(args):
            pass
        else:
            sl += [1.0]*(len(args)-len(sl))
            print 'Check number of entries!'
            print 'Scalefactor of 1 is used for non defined'
            print 'Arguments: ' + str(args)
            print 'Scalefactors: ' + str(sl)
            #usage()
            #sys.exit(2)
    # check and set scalefactor for non isotropic
    elif o in ('--scalenoiso'): 
        sln = [float(i) for i in a.split(',')]
        if len(sln)>=len(args):
            pass
        else:
            sln += [1.0]*(len(args)-len(sln))
            print 'Check number of entries!'
            print 'Scalefactor of 1 is used for non defined'
            print 'Arguments: ' + str(args)
            print 'Non isotropic scalefactors: ' + str(sln)
            #usage()
            #sys.exit(2)
    # check and set x shift
    elif o in ('--xshift'): 
        xshift = [float(i) for i in a.split(',')]
        if len(xshift)>=len(args):
            pass
        else:
            xshift = [0]*len(args)
            print 'Check number of entries!'
            print 'Zero x-shift is used for all data'
            print 'Arguments: ' + str(args)
            print 'X shift values: ' + str(sln)
    # set no non-isotropic note flag
    elif o == '-n': 
        n = True
    # set default legend flag
    elif o == '-l': 
        ls = True
    # check and set customized styles
    elif o == '--style': 
        style = a.split(',')
        if len(style)>=len(args):
            pass
        else:
            style += ['-']*(len(args)-len(style))
            print 'Check number of entries!'
            print 'Default line style is used for non-defined'
            print 'Arguments: ' + str(args)
            print 'Styles: ' + str(style)
            #usage()
            #sys.exit(2)
    # set line widths
    elif o in ('--lw','-b'): 
        lw = map(float,a.split(','))
        if len(lw)>=len(args):
            pass
        else:
            lw += [1.0]*(len(args)-len(lw))
            print 'Check number of entries!'
            print 'Default line width is used for non-defined'
            print 'Arguments: ' + str(args)
            print 'Line widths: ' + str(lw)
            #usage()
            #sys.exit(2)
    # set figure size
    elif o == '--size': 
        size = map(float,a.split(','))
        if len(size) == 2:
            fig.set_size_inches(size[0],size[1],forward=True)
        else:
            print 'Check number of entries!'
            print 'Default fiure size is used'
            #usage()
            #sys.exit(2)
    # check and set customized legend
    elif o == '--legend': 
        ls = True
        ll = a.split(',')
        ll = map(raw_string,ll)
        if len(ll)>=len(args):
            pass
        else:
            ll += ['No Legend defined']*(len(args)-len(ll))
            print 'Check number of entries!'
            print 'No Legend is added for non-defined'
            print 'Arguments: ' + str(args)
            print 'Legends: ' + str(ll)
            #usage()
            #sys.exit(2)
    # specify legend location
    elif o == '--legloc': 
        legloc = a

    # marker distance (a)
    elif o in ('-a'):
        srad = map(float,a.split(','))
        if len(srad)>=len(args):
            pass
        else:
            srad += [srad[0]]*(len(args)-len(srad))
            print 'Check number of entries!'
            print 'Uniform marker distance used'
            print 'Arguments: ' + str(args)
            print 'Dot-distance: ' + str(srad)
            #usage()
            #sys.exit(2)
        smooth = np.array(srad)!=0
        srad = np.array(srad)**2
    # local copy (dump)
    elif o in ('-d'):
        import os
        os.system('cp /usr2/gager/tools/Scripts/rptplot/rptplot.py .')
        sys.exit(2)
    # help
    elif o in ('-h','--help'): 
        usage()
        sys.exit(2)

# set title
if (np.array(sln)!=1).any() and not n:
    ti=ax1.get_title()
    plt.title(ti+' NON-ISOTROPIC SCALING!')

# check arguments
if len(args)==0: 
    print "arguments not defined"
    usage()
    sys.exit(2)

# plot legend
if ll == False:
    ll = [arg.split('/')[-1][:-4]+' ('+str(sl[i])+')' for i, arg in enumerate(args)]

# plot files
for i, arg in enumerate(args):
    data=np.loadtxt(arg,delimiter=None,skiprows=0)

    if smooth[i] and len(style)!=0:
        # visualize dots the graph   

        #create dummy data for legend
        plt.plot(data[:,0][0]*sl[i]+xshift[i],data[:,1][0]*sl[i]*sln[i], style[i], label=ll[i], lw=lw[i])

        meanxs=[]; meanys=[]
        n=0
        n0=0
        xv = data[:,0]
        yv = data[:,1]
        meanxs.append(xv[n])
        meanys.append(yv[n])

        while n<len(xv)-1:
            if (xv[n]-xv[n0])**2+(yv[n]-yv[n0])**2 < srad[i]:
                n+=1
            else:
                meanxs.append(xv[n])
                meanys.append(yv[n])
                n0=n

        meanxs.append(xv[n])
        meanys.append(yv[n])

        plt.plot(data[:,0]*sl[i]+xshift[i],data[:,1]*sl[i]*sln[i], style[i], marker='', lw=lw[i])
        data = np.hstack((np.array(meanxs)[:,np.newaxis],np.array(meanys)[:,np.newaxis]))
        plt.plot(data[:,0]*sl[i]+xshift[i],data[:,1]*sl[i]*sln[i], style[i], linestyle='')

    else:
        if len(style) == 0:
            plt.plot(data[:,0]*sl[i]+xshift[i],data[:,1]*sl[i]*sln[i], label=ll[i], lw=lw[i])
        else:
            plt.plot(data[:,0]*sl[i]+xshift[i],data[:,1]*sl[i]*sln[i], style[i], label=ll[i], lw=lw[i])

if ls == True:
    plt.legend(loc= legloc)

if len(xl)==2:
    plt.xlim(xl)

if len(yl)==2:
    plt.ylim(yl)

# show plot or write pdf
if pdf:
    plt.savefig('RPToutput.pdf')
else:
    plt.show()
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to