私は matplotlib.plt.contourf で使用されるマスクされた配列を持っており、グローバルマップに温度等高線を投影しています。私は輪郭を滑らかにしようとしていましたが、残念ながら、提案されたソリューションのどれもマスクされた配列を処理できないようです。これらのソリューションをテストしました:
- scipy.ndimage.gaussian_filter - 移動平均
- scipy.ndimage.zoom
それらのどれも機能しません(マスクされた値もカウントされます)。maskedArray で輪郭を滑らかにする方法はありますか
提案された「修復」ソリューションを試した後にこの部分を追加しましたが、結果は変わりませんでした。これがコードです(役立つ場合)
import Scientific.IO.NetCDF as S
import mpl_toolkits.basemap as bm
import numpy.ma as MA
import numpy as np
import matplotlib.pyplot as plt
import inpaint
def main():
fileobj = S.NetCDFFile('Bias.ANN.tas_A1_1.nc', mode='r')
# take the values
set1 = {'time', 'lat', 'lon'}
set2 = set(fileobj.variables.keys())
set3 = set2 - set1
datadim = set3.pop()
print "******************datadim: "+datadim
data = fileobj.variables[datadim].getValue()[0,:,:]
lon = fileobj.variables['lon'].getValue()
lat = fileobj.variables['lat'].getValue()
fileobj.close()
data, lon = bm.shiftgrid(180.,data, lon,start=False)
data = MA.masked_equal(data, 1.0e20)
#data2 = inpaint.replace_nans(data, 10, 0.25, 2, 'idw')
#- Make 2-D longitude and latitude arrays:
[lon2d, lat2d] =np.meshgrid(lon, lat)
#- Set up map:
mapproj = bm.Basemap(projection='cyl',
llcrnrlat=-90.0, llcrnrlon=-180.00,
urcrnrlat=90.0, urcrnrlon=180.0)
mapproj.drawcoastlines(linewidth=.5)
mapproj.drawmapboundary(fill_color='.8')
#mapproj.drawparallels(N.array([-90, -45, 0, 45, 90]), labels=[1,0,0,0])
#mapproj.drawmeridians(N.array([0, 90, 180, 270, 360]), labels=[0,0,0,1])
lonall, latall = mapproj(lon2d, lat2d)
cmap=plt.cm.Spectral
#- Make a contour plot of the temperature:
mymapf = plt.contourf(lonall, latall, data, 20, cmap=cmap)
#plt.clabel(mymapf, fontsize=12)
plt.title(cmap.name)
plt.colorbar(mymapf, orientation='horizontal')
plt.savefig('sample2.png', dpi=150, edgecolor='red', format='png', bbox_inches='tight', pad_inches=.2)
plt.close()
if __name__ == "__main__":
main()
このコードからの出力 (最初の図) と Panoply からの同じデータファイルの出力を比較しています。ズームインしてより正確に見ると、滑らかさの問題ではないように見えますが、pyplot モデルは 1 つのストライプをよりスリムにするか、輪郭が早くカットされます (外側の境界はこれを明確に示し、内側の輪郭はこの事実のために異なります)。pyplot モデルは Panoply モデルほど滑らかではないように見えます。(ほぼ) 同じモデルを取得するにはどうすればよいですか? 私はそれを正しく区別していますか?