2016-06-14 7 views
6

Ho una mappa di base del mondo, ed è piena di dati (lintrends_mean) usando pcolormesh. Dato che i dati hanno riquadri a griglia relativamente grandi, vorrei semplificare la trama. Tuttavia, non riesco a capire come farlo. L'impostazione dell'ombreggiatura = 'gouraud' nella funzione di tracciatura sfoca i bordi delle caselle della griglia, ma mi piacerebbe qualcosa di più bello di quello visto che i dati appaiono ancora macchiati.Come arrotondare per interpolazione quando si utilizza pcolormesh?

C'è stata una domanda simile qui posta con una risposta data, ma non capisco la risposta, in particolare da dove viene la "nuova profondità". Non posso commentare su questo per un chiarimento sia perché sono a corto di reputazione. interpolation with 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

+0

E 'guardando a blocchi potrebbe essere considerato una caratteristica, non un bug. Non fa apparire i tuoi dati su una griglia più fine di quanto non sia realmente. – tacaswell

+0

So che il blocco non è un bug. Il mio consulente di ricerca mi ha appena suggerito di appianare la griglia per motivi di presentazione, e non mi piace come sia stata applicata solo l'ombreggiatura di gouraud. – ChristineB

+0

Suggerisco di interpolare prima di stampare di. Ti dà più controllo. – tacaswell

risposta

4

avete un po 'varianti:

  1. Utilizza ombreggiatura speciale per pcolormesh.
  2. Utilizzare imshow che consente di interpolare i dati.
  3. Interpolare i dati con scipy.interpolate e stampare con pcolormesh.

Guardate l'esempio:

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

+0

Non riesco a utilizzare il metodo imshow poiché ciò non consente ai miei dati di estendersi all'intera mappa di base. Nella tua ultima sottotrama, la tua X & Y in f = interp2d (X, Y, data, kind = 'cubic') corrisponde al mio meshlon & meshlat? – ChristineB

+0

Sì, ma devono essere array 2d della stessa dimensione – Serenity

+0

Questo metodo non sta funzionando bene per me. Sto riscontrando problemi nel far funzionare bene gli schemi di interpolazione con i miei dati. Per l'interpolazione cubica, ottengo l'errore "RuntimeWarning: non è possibile aggiungere altri nodi perché il numero di B-spline. I coefficienti già superano il numero di punti dati m. Possibili cause: o s o m troppo piccolo." Non sono del tutto sicuro di cosa significhi, ma il risultato è una sorta di tabellone di dati vuoti vicino ai miei valori più alti. Questo è un effetto dei miei valori di dati e un diverso metodo di interpolazione funzionerebbe meglio? – ChristineB

Problemi correlati