2012-11-28 60 views
15

我在地圖上使用此代碼繪製數據:消除白邊

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from mpl_toolkits.basemap import Basemap 
from matplotlib.patches import Polygon 
from scipy.io import netcdf 

ncfile = netcdf.netcdf_file(myfile.nc,'r') 
lon = ncfile.variables['longitude'][:] 
lat = ncfile.variables['latitude'][:] 
data = ncfile.variables['mydata'][:] 
ncfile.close() 

m = Basemap(projection='nplaea', boundinglat=40, lon_0=270) 
m.drawcoastlines(linewidth=.6, zorder=2) 
m.drawparallels(np.arange(-80.,81.,20.), zorder=1) 
m.drawmeridians(np.arange(-180.,181.,20.), zorder=1) 
cNorm = mpl.colors.Normalize(vmin=0, vmax=np.nanmax(data)) 
cmap = plt.get_cmap('jet') 
lons, lats = np.meshgrid(lon, lat) 
x, y = m(lons, lats) 
datamap = m.pcolor(x, y, data, zorder=0) 
datamap.set_norm(cNorm) 
plt.colorbar(datamap, cmap=cmap, norm=cNorm, shrink=0.5) 
plt.savefig('figures/map_polar.png', dpi=150, bbox_inches='tight', pad_inches=0.4) 

這導致這個形象:enter image description here

正如你所看到的,有白色的差距網格單元之間。我怎樣才能擺脫它們?

+0

你可以把數據文件放在任何地方嗎? – tacaswell

+0

不幸的是,不,但它是有規律的間隔網格數據。 – HyperCube

+0

無論它值多少錢,我都無法使用隨機生成的(或常量)數據來重現您的問題......您使用的是什麼版本的matplotlib?也許它是一個已修復的錯誤?另外,在這種情況下'pcolormesh'會更快。嘗試使用它而不是'pcolor'。我懷疑(?)它會解決你的問題,但無論如何,它應該會更快。 –

回答

2

我曾經有同樣的問題。這很可能是longitude中的問題。 確保0360都存在於輸入中。如果沒有,請手動添加它們,然後 相應地更改爲mydata,以便它們具有相同的形狀。

+0

我使用的範圍是-180,180。這也應該起作用?事實上,180失蹤了,所以我添加了它,並將最後一列數據再次複製到數據中。但是,白色條紋依然存在。 – HyperCube

3

我知道這是一個老問題,但我想我會將我的解決方案添加到此問題。我發現,當我有完全相同的問題,你的問題是你的,即白線在我的劇情和網格去從-180到180,我的解決方案是使用底圖功能addcyclic

from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic 
SSTcyclic, lonCMIP5cyclic = addcyclic(SST, lonCMIP5) 

這解決了我的問題。歡呼聲,Trond

2

它看起來像我這樣的原始帖子實際上並沒有問關於0360度之間的白色區域。

我覺得OP談論顏色的每個平方這將與this bug一致的線路:

看來savig一個令pColor陰謀爲PDF格式總是包括網格線,這是不真正用於其他輸出格式一些PNG

這裏是開發商說的問題:

我看到網格線在產生的圖像在gs,xpdf Preview.app中,但不是在Adobe Reader中的 。當我放大預覽時,線條跳轉了一下, 並且無論縮放級別如何都始終與屏幕上的寬度相同。

這個例子中繪製的是很多多邊形,所以相鄰的多邊形共享一個具有完全相同座標的邊。代碼填充每個多邊形內部的 ,顯然一些渲染算法 在多邊形之間留下最小寬度線。

所以這是一個PDF查看器的問題,而不是pcolormatplotlib的任何其他方面。