传输底图-Cartopy

时间:2018-07-13 14:14:06

标签: matplotlib-basemap cartopy

我正在Python 2.7上使用底图,但想使用Python 3,因此转向了cartopy。如果您能给我一些建议,如何将我的代码从底图更改为Cartopy,那就太好了:

这是底图代码:

from mpl_toolkits.basemap import Basemap
    # plot map without continents and coastlines
    m = Basemap(projection='kav7',lon_0=0)
    # draw map boundary, transparent
    m.drawmapboundary()
    m.drawcoastlines()
    # draw paralells and medians, no labels
    if (TheLatInfo[1] == len(TheLatList)) & (TheLonInfo[1] == len(TheLonList)):
        m.drawparallels(np.arange(-90,90.,30.))
        m.drawmeridians(np.arange(-180,180.,60.))

grids = m.pcolor(LngArrLons,LngArrLats,MSKTheCandData,cmap=cmap,norm=norm,latlon='TRUE')

这是我发现的Cartopy示例,并做了一些改动:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.feature as cpf

ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines()
ax.set_boundary
ax.gridlines(draw_labels=False)
plt.show()

我不确定如何将网格线设置在正确的位置以及如何将网格线着色为黑色而不是灰色。此外,我想知道如何然后用数据插入/覆盖我的实际地图。 “ ax.pcolor”是否足够受Cartopy支持?

谢谢!

1 个答案:

答案 0 :(得分:1)

要将网格线涂成黑色,可以使用color=关键字:

ax.gridlines(color='black')

要指定纬度/经度网格线的位置,如果您实际上不关心标签,则只需要几行即可:

import matplotlib.ticker as mticker

gl = ax.gridlines(color='black')
gl.xlocator = mticker.FixedLocator([-180, -90, 0, 90, 180])
gl.ylocator = mticker.FixedLocator([-90,-45,0,45,90])

(撰写本文时,鲁滨逊投影不支持网格线标签。)

要将数据叠加在地图上pcolor应该可以,但是速度很慢。我建议使用pcolormesh,尽管您可以使用以下语法替换一个:

ax.pcolormesh(lon_values, lat_values, data)

请注意,如果您的数据来自与要绘制的地图投影相比不同的投影(通常为true),则您需要在绘图中指定数据的投影使用transform=关键字的语法。这告诉cartopy将您的数据从原始投影转换为地图的投影。平板Carrée与圆柱等距相同(例如,典型用于气候模型输出):

ax.pcolormesh(lon_values, lat_values, data, transform=ccrs.PlateCarree())