On Wed, Sep 26, 2012 at 2:07 PM, Michael Rawlins <rawlin...@yahoo.com>wrote:
>
>
> ------------------------------
> *From:* Benjamin Root <ben.r...@ou.edu>
> *To:* Michael Rawlins <rawlin...@yahoo.com>
> *Cc:* "matplotlib-users@lists.sourceforge.net" <
> matplotlib-users@lists.sourceforge.net>
> *Sent:* Wednesday, September 26, 2012 10:33 AM
> *Subject:* Re: [Matplotlib-users] error reading netcdf file
>
>
>
> On Wed, Sep 26, 2012 at 10:27 AM, Michael Rawlins <rawlin...@yahoo.com>wrote:
>
> Recently built and installed netCDF4-1.0. I'm running a script that has
> worked on two other linux OS systems. Error:
>
> File "test.py", line 96, in <module>
> data.missing_value=-9.99
> File "netCDF4.pyx", line 2570, in netCDF4.Variable.__setattr__
> (netCDF4.c:28242)
> File "netCDF4.pyx", line 2392, in netCDF4.Variable.setncattr
> (netCDF4.c:26309)
> File "netCDF4.pyx", line 1013, in netCDF4._set_att (netCDF4.c:12699)
> AttributeError: NetCDF: Write to read only
>
>
> The statement in the code triggers the error is:
>
> data.missing_value=-9.99 .
>
> MR
>
>
>
>
> This typically happens when one opens a netCDF4 Dataset object in 'r'
> mode, and/or if the file permissions for the file was set to read-only.
> When modifying an attribute, it is technically trying to write to the file.
>
> Ben Root
>
>
>
> Here is the file open statement:
>
> ncfile = NetCDFFile('statsPrcp_Uncertainty2_winter.nc', 'r')
>
> This worked fine in earlier versions. No where in the code do I try to
> write to a netCDF file. So I'm confused as to why specifying the read of
> the netCDF file would result in an error when designating the missing data
> value.
>
> Here's the code:
>
> # Works with the netCDF files in the tutorial, and also the
> # files available for download at:
> # http://www.cdc.noaa.gov/cdc/data.ncep.reanalysis.html
> # Adapted from the basemap example plotmap_pcolor.py,
> # Some of the variable names from that example are retained.
> #
> # Uses basemap's pcolor function. Pcolor accepts arrays
> # of the longitude and latitude points of the vertices on the pixels,
> # as well as an array with the numerical value in the pixel.
>
> verbose=0 #verbose=2 says a bit more
>
> import sys,getopt
> from mpl_toolkits.basemap import Basemap, shiftgrid, cm
> from netCDF4 import Dataset as NetCDFFile
> #from mpl_toolkits.basemap import NetCDFFile
> from pylab import *
> import matplotlib.pyplot as plt
>
> alloptions, otherargs= getopt.getopt(sys.argv[1:],'ro:p:X:Y:v:t:l:u:n:') #
> note the : after o and p
> proj='lam'
>
> cmap = cm.get_cmap('jet_r', 10) # 10 discrete colors
>
> print "\nPlotting, please wait...maybe more than 10 seconds"
> if proj=='lam': #Lambert Conformal
> 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.)
>
> xsize = rcParams['figure.figsize'][0]
> fig=figure(figsize=(xsize,m.aspect*xsize))
> #cax = axes([0.88, 0.1, 0.06, 0.81]) # colorbar axes for map w/ graticule
>
>
> ############################################################################################
> subplots_adjust(left=None, bottom=None, right=0.9, top=None, wspace=0.05,
> hspace=0.03)
> # Make the first map at upper left
> plt.subplot(2,2,1)
>
> ncfile = NetCDFFile('statsPrcp_Uncertainty2_winter.nc', 'r')
>
> xvar='rlon'
> print "shape of "+xvar+': ',ncfile.variables[xvar].shape
> if ncfile.variables[xvar][:].ndim ==1:
> print "X is independent of Y"
> lon1d=ncfile.variables[xvar][:]
> else:
> lon1d=False
> if ncfile.variables[xvar][:].ndim ==2: lon2d=ncfile.variables[xvar][:]
> if ncfile.variables[xvar][:].ndim ==3:
> lon2d=ncfile.variables[xvar][0,:,:]
> print "shape of lond2d:", lon2d.shape
>
> yvar='rlat'
> print "shape of "+yvar+': ',ncfile.variables[yvar].shape
> if ncfile.variables[yvar][:].ndim ==1:
> print "Y is independent of X"
> lat1d=ncfile.variables[yvar][:]
> else:
> lat1d=False
> if ncfile.variables[yvar][:].ndim ==2: lat2d=ncfile.variables[yvar][:]
> if ncfile.variables[yvar][:].ndim ==3:
> lat2d=ncfile.variables[yvar][0,:,:]
> print "shape of lat2d:", lat2d.shape
>
> thevar='diff'
> data=ncfile.variables[thevar]
> dataa=data[:]
> theshape=dataa.shape
> try:
> add_offset=ncfile.variables[thevar].add_offset
> print "will use add_offset=",add_offset
> except:
> add_offset=0.
> print "shape of "+thevar+': ',theshape
> if len(theshape)>2:
> print "there are apparently",theshape[0],"records"
> if not therec: therec=raw_input("enter record number to plot=>")
> therec=int(therec)
> extratext=" rec=%d" %therec
> if len(theshape)>3:
> print "there are apparently",theshape[1],"levels"
> if not thelev: thelev=raw_input("enter level number to plot=>")
> thelev=int(thelev)
> extratext=extratext+" lev=%d" %thelev
> if len(theshape)>3:
> slice=dataa[therec,thelev,:,:]+add_offset
> elif len(theshape)>2:
> slice=dataa[therec,:,:]+add_offset
> else:
> slice=dataa+add_offset
>
> data.missing_value=-9.99
>
>
> I think I know why this used to work in the past. I think netCDF4 used to
recognize the "missing_value" attribute as a special value. It is now
._FillValue. But I am still not sure you can save a value to that
attribute in a read-only Dataset. You might have to perform the mask after
extracting the data.
Note, setting the _FillValue *after* extracting the data to the "dataa"
variable won't change "dataa". I don't see how setting data.missing_value
is supposed to actually help you.
Ben Root
------------------------------------------------------------------------------
How fast is your code?
3 out of 4 devs don\\\'t know how their code performs in production.
Find out how slow your code is with AppDynamics Lite.
http://ad.doubleclick.net/clk;262219672;13503038;z?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users