如何解决如何放大cartopy.crs.Orthographic中的特定纬度?
我不确定这是否可行,但我基本上是在尝试在正交地图中隔离北极圈纬度 (60N) 并保持椭圆体,而不是将放大的图像设为矩形/正方形。
>这是我所拥有的:
fig = plt.figure(figsize=[20,10])
ax1 = plt.subplot(1,1,projection=ccrs.Orthographic(0,90))
for ax in [ax1]:
ax.coastlines(zorder=2)
ax.stock_img()
ax.gridlines()
这给出了我想要的北极视图,但我希望它停在 60N。
解决方法
要获得正交地图的放大和方形范围,您需要绘制一些控制点(例如,使用 .scatter)或在投影坐标中指定正确的 extent
(更困难)。这是要尝试的代码。
import cartopy
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure(figsize=[8,8])
lonlatproj = ccrs.PlateCarree()
my_projn = ccrs.Orthographic(central_longitude=0,central_latitude=90)
ax1 = plt.subplot(1,1,projection=my_projn)
# set `lowlat` as lower limits of latitude to plot some points
# these points will determine the plot extents of the map
lowlat = 60 + 2.8 # and get 60
lons,lats = [-180,-90,90],[lowlat,lowlat,lowlat]
# plot invisible points to get map extents
ax1.scatter(lons,lats,s=0,color='r',transform=lonlatproj)
#ax1.stock_img() #uncomment to get it plotted
ax1.coastlines(lw=0.5,zorder=2)
ax1.gridlines(lw=2,ec='black',draw_labels=True)
方法二:通过在投影坐标中指定正确的范围
import cartopy
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure(figsize=[8,projection=my_projn)
# These 2 lines of code grab extents in projection coordinates
_,y_min = my_projn.transform_point(0,60,lonlatproj) #(0.0,-3189068.5)
x_max,_ = my_projn.transform_point(90,lonlatproj) #(3189068.5,0)
# prep extents of the axis to plot map
pad = 25000
xmin,xmax,ymin,ymax = y_min-pad,x_max+pad,y_min-pad,x_max+pad
# set extents with prepped values
ax1.set_extent([xmin,ymax],crs=my_projn) # data/projection coordinates
ax1.stock_img()
ax1.coastlines(lw=0.5,zorder=2)
# plot other layers of data here using proper values of zorder
# finally,plot gridlines
ax1.gridlines(draw_labels=True,x_inline=False,y_inline=True,color='k',linestyle='dashed',linewidth=0.5)
plt.show()
方法三用圆形边界绘制地图
可运行代码:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import numpy as np
r_limit = 3214068.5 #from: ax.get_ylim() of above plot
# some settings
lonlatproj = ccrs.PlateCarree()
my_projn = ccrs.Orthographic(central_longitude=0,central_latitude=90)
fig = plt.figure(figsize=[8,8])
ax = plt.subplot(1,projection=my_projn)
# add bluemarble image
ax.stock_img()
# add coastlines
ax.coastlines(lw=0.5,color="black",zorder=20)
# draw graticule (of meridian and parallel lines)
gls = ax.gridlines(draw_labels=True,crs=ccrs.PlateCarree(),lw=3,color="gold",xlocs=range(-180,180,30),ylocs=range(-80,91,10))
# add extra padding to the plot extents
r_extent = r_limit*1.0001
ax.set_xlim(-r_extent,r_extent)
ax.set_ylim(-r_extent,r_extent)
# Prep circular boundary
circle_path = mpath.Path.unit_circle()
circle_path = mpath.Path(circle_path.vertices.copy() * r_limit,circle_path.codes.copy())
#set circle boundary
ax.set_boundary(circle_path)
#hide frame
ax.set_frame_on(False) #hide the rectangle frame
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。