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