views:

50

answers:

1

Hey guys,

I am a new user to the python & matplotlib, this might be a simple question but I searched the internet for hours and couldn't find a solution for this.

I am plotting precipitation data from which is in the NetCDF format. What I find weird is that, the data doesn't have any negative values in it.(I checked that many times,just to make sure). But the value in the colorbar starts with a negative value (like -0.0000312 etc). It doesnt make sense because I dont do any manipulations to the data, other that just selecting a part of the data from the big file and plotting it.

So my code doesn't much to it. Here is the code:

from mpl_toolkits.basemap import Basemap  
import numpy as np  
import matplotlib.pyplot as plt  
from netCDF4 import Dataset  
cd progs  
f=Dataset('V21_GPCP.1979-2009.nc')  
lats=f.variables['lat'][:]  
lons=f.variables['lon'][:]  
prec=f.variables['PREC'][:]  
la=lats[31:52]  
lo=lons[18:83]  
pre=prec[0,31:52,18:83]  
m = Basemap(width=06.e6,height=05.e6,projection='gnom',lat_0=15.,lon_0=80.)  
x, y = m(*np.meshgrid(lo,la))  
m.drawcoastlines()  
m.drawmapboundary(fill_color='lightblue')  
m.drawparallels(np.arange(-90.,120.,5.),labels=[1,0,0,0])  
m.drawmeridians(np.arange(0.,420.,5.),labels=[0,0,0,1])  
cs=m.contourf(x,y,pre,50,cmap=plt.cm.jet)  
plt.colorbar()  

The output that I got for that code was a beautiful plot, with the colorbar starting from the value -0.00001893, and the rest are positive values, and I believe are correct. Its just the minimum value thats bugging me.

I would like to know:

  1. Is there anything wrong in my code? cos I know that the data is right.
  2. Is there a way to manually change the value to 0?
  3. Is it right for the values in the colorbar to change everytime we run the code, cos for the same data, the next time I run the code, the values go like this " -0.00001893, 2.00000000, 4.00000000, 6.00000000 etc"
  4. I want to customize them to "0.0, 2.0, 4.0, 6.0 etc"

Thanks, Vaishu

+1  A: 

Yes, you can manually format everything about the colorbar. See this:

import matplotlib.colors as mc
import matplotlib.pyplot as plt
plt.imshow(X, norm=mc.Normalize(vmin=0))
plt.colorbar(ticks=[0,2,4,6], format='%0.2f')
  1. Many plotting functions including imshow, contourf, and others include a norm argument that takes a Normalize object. You can set the vmin or vmax attributes of that object to adjust the corresponding values of the colorbar.

  2. colorbar takes the ticks and format arguments to adjust which ticks to display and how to display them.

Steve
Contour also takes the values of the wanted contours as a argument, so he could also do cs=m.contourf(x,y,pre,np.arange(0,pre.max(),2),cmap=plt.cm.jet)
tillsten
Good point, but I'm not certain that it corrects the problem with the colorbar.
Steve