2016-06-14 24 views
6

Mam mapę bazową świata i jest ona wypełniona danymi (lintrends_mean) przy użyciu pcolormesh. Ponieważ dane mają stosunkowo duże pola siatki, chciałbym wygładzić fabułę. Jednak nie mogę wymyślić, jak to zrobić. Ustawienie cieniowania = 'gouraud' w funkcji kreślenia powoduje rozmycie krawędzi pól siatki, ale chciałbym mieć coś ładniejszego, ponieważ dane nadal wydają się plamiste.Jak wygładzać interpolację podczas korzystania z pcolormesh?

Pojawiło się podobne pytanie z odpowiedzią, ale nie rozumiem odpowiedzi, szczególnie, gdy pochodzi "nowa dusza". Nie mogę tego skomentować w celu wyjaśnienia, ponieważ brakuje mi reputacji. 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

to wygląda topornie można uznać za cecha, a nie bug. Nie sprawia, że ​​dane wyglądają na lepszą siatkę niż w rzeczywistości. – tacaswell

+0

Wiem, że blokowanie nie jest błędem. Mój doradca naukowy zasugerował, że wygładzam siatkę dla celów prezentacji, a nie podobało mi się, jak wyglądało stosowanie cieniowania gouraud. – ChristineB

+0

Sugeruję interpolację przed kreśleniem niż. Daje ci większą kontrolę. – tacaswell

Odpowiedz

4

Masz jakieś warianty:

  1. użyć specjalnego cieniowania dla pcolormesh.
  2. Użyj imshow, która umożliwia interpolację danych.
  3. Przeprowadź interpolację danych za pomocą scipy.interpolate i spisz za pomocą pcolormesh.

Spójrz na przykład:

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

Nie mogę użyć metody imshow, ponieważ powoduje to, że moje dane nie obejmują całej mapy bazowej. Czy w twoim ostatnim wątku twoje X i Y w f = interp2d (X, Y, dane, rodzaj = "sześcienne") odpowiadają mojemu meshlonowi i meshlatowi? – ChristineB

+0

Tak, ale muszą to być macierze 2d tego samego rozmiaru. – Serenity

+0

Ta metoda nie działa dobrze dla mnie. Mam problemy z uzyskaniem schematów interpolacji, które dobrze działają z moimi danymi. W przypadku interpolacji sześciennej pojawia się błąd "RuntimeWarning: Nie można dodać żadnych węzłów, ponieważ liczba B-splajn. Współczynniki już przekraczają liczbę punktów danych m. Prawdopodobne przyczyny: albo s albo m jest za małe." Nie jestem do końca pewien, co to oznacza, ale wynikiem jest rodzaj tablicy niewykorzystanych danych w pobliżu moich najwyższych wartości. Czy jest to efekt moich wartości danych i czy inna metoda interpolacji działa lepiej? – ChristineB

Powiązane problemy