使用pcolormesh时如何通过插值进行平滑处理? [英] How to smooth by interpolation when using pcolormesh?

查看:731
本文介绍了使用pcolormesh时如何通过插值进行平滑处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个世界底图,并且使用pcolormesh填充了数据(lintrends_mean).因为数据具有相对较大的网格框,所以我想使绘图变得平滑.但是,我不知道如何做到这一点.在绘图功能中设置shading ='gouraud'会使网格框的边缘模糊,但是我想要一个比这看起来更好的外观,因为数据仍然显得斑点.

I have a basemap of the world, and it's filled with data (lintrends_mean) using pcolormesh. Because the data has relatively large grid boxes, I'd like to smooth the plot. However, I can't figure out how to do this. Setting shading='gouraud' in the plotting function blurs the edges of the grid boxes, but I'd like something nicer-looking than that since the data still appears blotchy.

这里也有类似的问题,给出了答案,但我不明白答案,尤其是"newdepth"来自何处.由于声誉欠佳,我也无法对此发表评论以进行澄清. 使用matplotlib pcolor进行插值

There was a similar question asked here with an answer given, but I don't understand the answer, particularly where the "newdepth" comes from. I can't comment on it for clarification either since I'm short on reputation. 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()

推荐答案

您有一些变体:

  1. pcolormesh使用特殊阴影.
  2. 使用imshow允许插值数据.
  3. 使用scipy.interpolate插值数据,并使用pcolormesh绘制.
  1. Use special shading for pcolormesh.
  2. Use imshow which allows to interpolated data.
  3. Interpolate data with scipy.interpolate and plot with pcolormesh.

看例子:

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()

这篇关于使用pcolormesh时如何通过插值进行平滑处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆