tomwalters@100: #!/usr/bin/env python tomwalters@100: """ tomwalters@100: spider_plot.py tomwalters@100: tomwalters@100: Created by Thomas Walters on 2010-09-12. tomwalters@100: """ tomwalters@100: tomwalters@212: import sys tomwalters@212: import getopt tomwalters@221: import matplotlib as mpl tomwalters@222: mpl.use('PDF') tomwalters@100: import numpy as np tomwalters@100: import pylab as p tomwalters@100: import mpl_toolkits.mplot3d.axes3d as p3 tomwalters@100: from matplotlib import cm tomwalters@100: import matplotlib.ticker as ticker tomwalters@100: tomwalters@212: help_message = ''' tomwalters@212: Plot the spider. tomwalters@100: tomwalters@212: Arguments: tomwalters@212: -i --input_file tomwalters@212: -o --output_file tomwalters@212: ''' tomwalters@100: tomwalters@212: class Usage(Exception): tomwalters@212: def __init__(self, msg): tomwalters@212: self.msg = msg tomwalters@100: tomwalters@100: tomwalters@212: def main(argv=None): tomwalters@212: if argv is None: tomwalters@212: argv = sys.argv tomwalters@212: try: tomwalters@212: try: tomwalters@212: opts, args = getopt.getopt(argv[1:], "hi:o:", tomwalters@212: ["help", "input_file=", "output_file="]) tomwalters@212: except getopt.error, msg: tomwalters@212: raise Usage(msg) tomwalters@212: tomwalters@212: # defaults tomwalters@212: input_file = "results_iteration_15.txt" tomwalters@222: output_file = "results_iteration_15.png" tomwalters@212: tomwalters@212: # option processing tomwalters@212: for option, value in opts: tomwalters@212: if option in ("-h", "--help"): tomwalters@212: raise Usage(help_message) tomwalters@212: if option in ("-i", "--input_file"): tomwalters@212: input_file = value tomwalters@212: if option in ("-o", "--output_file"): tomwalters@212: output_file = value tomwalters@212: tomwalters@212: except Usage, err: tomwalters@212: print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg) tomwalters@212: print >> sys.stderr, "\t for help use --help" tomwalters@212: return 2 tomwalters@220: tomwalters@220: central_vtl=15 tomwalters@220: central_vtl_scaling=112.32 tomwalters@220: tomwalters@212: # Read in a file with lines in the form tomwalters@212: # Pitch Scale Percentage tomwalters@212: xs=[] tomwalters@212: ys=[] tomwalters@212: zs=[] tomwalters@212: f = open(input_file, 'r') tomwalters@212: for line in f: tomwalters@212: if line[0] != "#": tomwalters@212: values = line.strip().split(' ') tomwalters@212: xs.append(central_vtl*central_vtl_scaling/float(values[1])) tomwalters@212: ys.append(float(values[0])) tomwalters@212: zs.append(float(values[2])) tomwalters@100: tomwalters@100: tomwalters@212: # Define a tiny sphere, centered on the origin, which tomwalters@212: # we'll shift to the desired position. tomwalters@212: u=np.r_[0:2*np.pi:50j] tomwalters@212: v=np.r_[0:np.pi:50j] tomwalters@212: sx=0.01*np.outer(np.cos(u),np.sin(v)) tomwalters@212: sy=0.01*np.outer(np.sin(u),np.sin(v)) tomwalters@212: sz=2.5*np.outer(np.ones(np.size(u)),np.cos(v)) tomwalters@100: tomwalters@212: fig=p.figure() tomwalters@212: ax = p3.Axes3D(fig, azim=-80, elev=60) tomwalters@100: tomwalters@212: colormap = cm.get_cmap('jet', 100) tomwalters@100: tomwalters@212: # Note: here I fake out the lack of proper logarihmic scales on 3D axes in tomwalters@212: # matplotlib by just plotting log values on a linear scale and renaming tomwalters@212: # the labels. tomwalters@212: # (This doesn't work: ax.w_yaxis.set_scale('log') ax.w_xaxis.set_scale('log')) tomwalters@100: tomwalters@212: # Plot the values seven at a time as dark lines. tomwalters@212: # These are the individual spokes of the spoke pattern. tomwalters@212: n=7 tomwalters@212: for i in xrange(0,8): tomwalters@212: ax.plot(np.log(xs[i*n:(i+1)*n]), np.log(ys[i*n:(i+1)*n]), zs[i*n:(i+1)*n], color=[0,0,0]) tomwalters@100: tomwalters@212: for x,y,z in zip(xs,ys,zs): tomwalters@212: ax.plot(np.log([x, x]), np.log([y, y]), [z, 0], color=[0.8,0.8,0.8]) tomwalters@212: ax.plot_surface(sx+np.log(x),sy+np.log(y),sz+z, color=colormap(int(z)), linewidth=0) tomwalters@100: tomwalters@212: ax.set_ylabel('GPR/Hz') tomwalters@212: ax.set_xlabel('VTL/cm') tomwalters@212: ax.set_zlabel('Percent correct') tomwalters@212: ax.set_ylim3d(np.log([131,225])) tomwalters@212: ax.set_xlim3d(np.log([9.9, 22.1])) tomwalters@212: ax.set_zlim3d([-1, 101]) tomwalters@212: ax.w_zaxis.set_major_locator(ticker.FixedLocator([0, 20, 40, 60, 80, 100])) tomwalters@100: tomwalters@212: ax.w_xaxis.set_major_locator(ticker.FixedLocator(np.log([10,15,22]))) tomwalters@212: ax.w_xaxis.set_ticklabels(['10', '15', '22']) tomwalters@212: ax.w_yaxis.set_major_locator(ticker.FixedLocator(np.log([132, 172, 224]))) tomwalters@212: ax.w_yaxis.set_ticklabels(['132', '172', '224']) tomwalters@100: tomwalters@212: #for a in ax.w_xaxis.get_ticklines()+ax.w_xaxis.get_ticklabels(): tomwalters@212: # a.set_visible(False) tomwalters@101: tomwalters@212: #for a in ax.w_yaxis.get_ticklines()+ax.w_yaxis.get_ticklabels(): tomwalters@212: # a.set_visible(False) tomwalters@212: tomwalters@212: tomwalters@212: #p.show() tomwalters@222: p.savefig(output_file) tomwalters@212: tomwalters@219: if __name__ == "__main__": tomwalters@222: sys.exit(main())