web-dev-qa-db-fra.com

Comment lisser par interpolation lors de l'utilisation de pcolormesh?

J'ai un fond de carte du monde, et il est rempli de données (lintrends_mean) en utilisant pcolormesh. Parce que les données ont des boîtes de grille relativement grandes, je voudrais lisser le tracé. Cependant, je ne peux pas comprendre comment procéder. La définition de shading = 'gouraud' dans la fonction de traçage rend les bords des cases de la grille floues, mais j'aimerais quelque chose de plus joli que cela puisque les données semblent toujours tachées.

Il y avait une question similaire posée ici avec une réponse donnée, mais je ne comprends pas la réponse, en particulier d'où vient le "newdepth". Je ne peux pas non plus le commenter pour clarification car je manque de réputation. interpolation avec 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

14
ChristineB

Vous avez quelques variantes:

  1. Utilisez un ombrage spécial pour pcolormesh.
  2. Utilisez imshow qui permet d'interpoler les données.
  3. Interpoler les données avec scipy.interpolate et tracez avec pcolormesh.

Regardez l'exemple:

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

12
Serenity