On Thu, Jan 12, 2012 at 2:20 PM, Michael Rawlins <rawlin...@yahoo.com>wrote:
>
> On 01/12/12 Ben Root wrote:
>
> Just a quick suggestion for cleaning up your code, please look into the
> argparse module to make command-line parsing so much easier to use.
> <http://docs.python.org/dev/library/argparse.html>
> http://docs.python.org/dev/library/argparse.html
>
> Ben Root
>
>
>
> Command line parsing? I'm new to python and matplotlib and was given this
> code by a colleague. I've managed to make simple modifications. Don't know
> enough yet to use the examples in the link you provide.
>
> I've simplified my code as much as possible. The first 50 lines make a
> map. The code below that makes a 4 panel graphic. Seems that plt.figure
> invokes a new plot window. But plt.semilogy, plt.loglog, and plt.hist do
> not, keeping the panels in a single window. This is what I need. Trying now
> to figure out how to transfer the fig=plt.figure line into the subplot
> section, without popping up a new window.
>
> Mike
>
>
>
Ok, a quick crash course:
A "figure" can hold one or more "axes" (or subplots). When using "plt",
you can choose to make figures explicitly with the "fig = plt.figure()"
command or not. The same is true for axes objects. If you call a command
that needs a figure and/or an axes object to have been made and they don't
exist, then they are made for you automatically. Otherwise, the most
recently accessed figure/axes are assumed. This is why plt.hist(),
plt.semilog() and others are not creating a new figure window if one
already existed.
Anyway, for your code, you do not want to bring in the plt.figure() call
into the subploting section. The example you were given takes advantage of
pyplot's implicit syntax (where it is implicitly assumed which axes/figure
object you are using). However, I personally do not like that approach, and
instead decided to show you an explicit style. I created a foobar()
function that takes a blank figure object and other parameters, creates the
four subplot axes and performs drawing on each of them. Note that the
title is for the subplot, not for the figure. If you want a title for the
figure above all the other subplots, use "fig.suptitle()". I then have a
loop where a figure is created each time, the foobar() function acts on
that figure, saved and then cleared before the next iteration.
Note, I noticed you had "plt.show()" commented out before the call to
"plt.savefig()". Usually, you will want savefig() to come *before* show()
because closing the figure window will destroy the figure object, resulting
in a blank figure to save if done afterwards.
I hope this is helpful!
Ben Root
verbose=0 #verbose=2 says a bit more
import sys,getopt
from mpl_toolkits.basemap import Basemap, shiftgrid, cm
#from netCDF3 import Dataset as NetCDFFile
from mpl_toolkits.basemap import NetCDFFile
from pylab import *
import matplotlib.pyplot as plt
# Here set map title and the file containing gridded data to plot
thetitle='Map #1'
ncfile = NetCDFFile('simple_xy.nc', 'r') # Here's filename
startlon=-180 #default assumption for starting longitude
m = Basemap(llcrnrlon=-80.6,llcrnrlat=38.4,urcrnrlon=-66.0,urcrnrlat=47.7,\
resolution='l',area_thresh=1000.,projection='lcc',\
lat_1=65.,lon_0=-73.3)
xtxt=200000. #offset for text
ytxt=200000.
parallels = arange(38.,48.,2.)
meridians = arange(-80.,-64.,2.)
if verbose>1: print m.__doc__
xsize = rcParams['figure.figsize'][0]
for fig_index in range(140) :
fig=plt.figure(figsize=(xsize,m.aspect*xsize))
fig.subplots_adjust(hspace=0.4, wspace=0.4)
if not thetitle :
title = thevar + extratext
else :
title = thetitle
foobar(fig, m, title)
fig.savefig("map_%d.eps" % fig_index)
plt.clf() # Clears the figure object
def foobar(fig, m, title) :
fig.subplots_adjust(hspace=0.4,wspace=0.4)
ax = fig.add_subplot(2,2,1)
# draw coastlines and political boundaries.
m.drawcoastlines(ax=ax)
m.drawcountries(ax=ax)
m.drawstates(ax=ax)
title(title)
x = linspace(0,10,101)
y = exp(x)
l1 = ax.semilogy(x,y,color='m',linewidth=2)
ax = fig.add_subplot(2,2,2)
y = x**-1.67
l1 = ax.loglog(x,y)
ax = fig.add_subplot(2,2,3)
x = arange(1001)
y = mod(x,2.87)
l1 = ax.hist(y,color='r',rwidth = 0.8)
ax = fig.add_subplot(2,2,4)
l1 =
plt.hist(y,bins=25,normed=True,cumulative=True,orientation='horizontal')
------------------------------------------------------------------------------
RSA(R) Conference 2012
Mar 27 - Feb 2
Save $400 by Jan. 27
Register now!
http://p.sf.net/sfu/rsa-sfdev2dev2
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users