【问题标题】:Transferring basemap - cartopy传输底图 - cartopy
【发布时间】:2018-12-21 22:56:20
【问题描述】:

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

我不确定如何将网格线设置在确切的位置以及如何将它们着色为黑色而不是灰色。此外,我想知道如何用数据插入/覆盖我的实际地图。 cartopy 对 "ax.pcolor" 的支持是否足够好?

谢谢!

【问题讨论】:

    标签: matplotlib-basemap cartopy


    【解决方案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])
    

    (在撰写本文时,Robinson 投影不支持网格线标签。)

    要将您的数据叠加在地图上pcolor 应该可以工作,但速度很慢。我会推荐pcolormesh,尽管您可以用这种语法替换另一个:

    ax.pcolormesh(lon_values, lat_values, data)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多