How to smooth interpolation when using pcolormesh?

I have a basic world map and it is populated with data (lintrends_mean) using pcolormesh. Since the data has relatively large grids, I would like to smooth the graph. However, I cannot figure out how to do this. Setting the shading = 'gouraud' in the drawing function blurs the edges of the grid cells, but I would like to get something more pleasant than this, because the data still seems spotty.

A similar question was asked here with the answer, but I do not understand the answer, especially in cases where a "new step" occurs. I cannot comment on this for clarification either since I lost my reputation. interpolation using matplotlib pcolor

#Set cmap properties bounds = np.array([0.1,0.2,0.5,1,2,3,4,6,9,13,20,35,50]) norm = colors.LogNorm(vmin=0.01,vmax=55) #creates logarithmic scale #cmap.set_under('#000099') # I want to use this- edit in Paint cmap.set_over('#660000') # everything above range of colormap fig = plt.figure(figsize=(15.,10.)) #create figure & size m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') #create basemap & specify data area & res m.drawcoastlines(linewidth=1) m.drawcountries(linewidth=1) m.drawparallels(np.arange(-90,90,30.),linewidth=0.3) m.drawmeridians(np.arange(-180.,180.,90.),linewidth=0.3) meshlon,meshlat = np.meshgrid(lon,lat) #meshgrid turns lats & lons into 2D arrays x,y = m(meshlon,meshlat) #assign 2D arrays to new variables trend = m.pcolormesh(x,y,lintrends_mean,cmap=plt.get_cmap('jet'),norm=norm) #plot the data & specify colormap & color range cbar=m.colorbar(trend,size="3%", label='Linear Trend (mm/day/decade)',ticks=bounds,extend="max") cbar.set_ticklabels(bounds) plt.title('Linear Trends of PR (CanESM2 1979-2014)',fontsize=16) plt.xlabel('Longitude',fontsize=10) plt.ylabel('Latitude',fontsize=10) plt.show() 

enter image description here

+6
source share
1 answer

You have several options:

  • Use custom shading for pcolormesh .
  • Use imshow , which allows you to interpolate data.
  • Interpolate data with scipy.interpolate and display with pcolormesh .

Take a look at an example:

 import matplotlib.pylab as plt import numpy as np from scipy.interpolate import interp2d data = np.random.random((30,30)) X = np.arange(0, 30, 1) Y = np.arange(0, 30, 1) X, Y = np.meshgrid(X, Y) # colormesh original plt.subplot(3, 2, 1) plt.pcolormesh(X, Y, data, cmap='RdBu') # pcolormesh with special shading plt.subplot(3, 2, 2) plt.pcolormesh(X, Y, data, cmap='RdBu',shading='gouraud') # imshow bilinear interp. plt.subplot(3, 2, 3) plt.imshow(data, cmap='RdBu', interpolation = 'bilinear') # imshow bicubic interp. plt.subplot(3, 2, 4) plt.imshow(data, cmap='RdBu', interpolation = 'bicubic') # scipy interp. cubic f = interp2d(X, Y, data, kind='cubic') xnew = np.arange(0, 30, .1) ynew = np.arange(0, 30, .1) data1 = f(xnew,ynew) Xn, Yn = np.meshgrid(xnew, ynew) plt.subplot(3, 2, 5) plt.pcolormesh(Xn, Yn, data1, cmap='RdBu') plt.show() 

enter image description here

+4
source

All Articles