Matplotlib:围绕底图创建 lat/lon white/black 圆形边界框
Matplotlib: Create lat/lon white/black round bounding box around basemap
我正在尝试将我的 matplotlib 地图周围的默认框架设计更改为 lon/lat 白色和黑色圆形 'bounding box' 类型的框架,例如,黑色从 90 度延伸W 到 45 度 W,白色从 45W 到 0 度,等等
为矩形地图的 R 用户(参见:http://menugget.blogspot.co.uk/2012/04/add-frame-to-map.html)开发了一个非常相似的代码,但我没有找到任何适合 Python 用户的代码。
有谁知道 Python 中是否有允许这种框架设计的软件包?
下面是我在 python 中绘制南极洲的代码。代码下图显示了我想要实现的 R 等效项。
代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
fig = plt.figure(figsize=(11.7,8.3))
plt.subplots_adjust(left=0.05,right=0.95,top=0.90,bottom=0.05,wspace=0.15,hspace=0.05)
ax = plt.subplot(111)
x1 = -180
x2 = 180
y1 = -90
y2 = 90
m = Basemap(projection='spstere', llcrnrlat=y1,urcrnrlat=y2,llcrnrlon=x1,urcrnrlon=x2,boundinglat=-63,lon_0=180, resolution='l',round=True)
m.drawmeridians(np.arange(0,360,60),labels=[1,1,1,1],linewidth=0.5, fontsize=10, dashes=[1,5])
m.drawparallels(np.arange(-90,90,20),linewidth=0.5, fontsize=10, dashes=[1,5])
m.drawcoastlines(linewidth=0.5)
fig.show()
我不确定这是否特别可靠,但它适用于您的示例,并且是我第一次真正体验底图(之前做过一些映射)。
from matplotlib.patches import Wedge
def draw_round_frame(m, width_percent=0.05, degree=45):
centre_x = (ax.get_xlim()[0] + ax.get_xlim()[1]) / 2
centre_y = (ax.get_ylim()[0] + ax.get_ylim()[1]) / 2
width = abs(centre_x) * width_percent
inner_radius = abs(centre_x) - width/2
outer_radius = inner_radius + width
angle_breaks = list(range(0, 361, degree))
for i, (from_angle, to_angle) in enumerate(list(zip(angle_breaks[:-1], angle_breaks[1:]))):
color='white' if i%2 == 0 else 'black'
wedge = Wedge((centre_x, centre_y), outer_radius, from_angle, to_angle, width=outer_radius - inner_radius,
facecolor=color,
edgecolor='black',
clip_on=False,
ls='solid',
lw=1)
ax.add_patch(wedge)
要使用,只需在 fig.show()
之前调用它
draw_round_frame(m)
plt.show()
它应该比实际更多地使用地图坐标,并且它与轴重叠,因为我目前无法想出在地图本身周围添加更多 space 的方法,但可能会给你一个想法开始。
我正在尝试将我的 matplotlib 地图周围的默认框架设计更改为 lon/lat 白色和黑色圆形 'bounding box' 类型的框架,例如,黑色从 90 度延伸W 到 45 度 W,白色从 45W 到 0 度,等等
为矩形地图的 R 用户(参见:http://menugget.blogspot.co.uk/2012/04/add-frame-to-map.html)开发了一个非常相似的代码,但我没有找到任何适合 Python 用户的代码。
有谁知道 Python 中是否有允许这种框架设计的软件包?
下面是我在 python 中绘制南极洲的代码。代码下图显示了我想要实现的 R 等效项。
代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
fig = plt.figure(figsize=(11.7,8.3))
plt.subplots_adjust(left=0.05,right=0.95,top=0.90,bottom=0.05,wspace=0.15,hspace=0.05)
ax = plt.subplot(111)
x1 = -180
x2 = 180
y1 = -90
y2 = 90
m = Basemap(projection='spstere', llcrnrlat=y1,urcrnrlat=y2,llcrnrlon=x1,urcrnrlon=x2,boundinglat=-63,lon_0=180, resolution='l',round=True)
m.drawmeridians(np.arange(0,360,60),labels=[1,1,1,1],linewidth=0.5, fontsize=10, dashes=[1,5])
m.drawparallels(np.arange(-90,90,20),linewidth=0.5, fontsize=10, dashes=[1,5])
m.drawcoastlines(linewidth=0.5)
fig.show()
我不确定这是否特别可靠,但它适用于您的示例,并且是我第一次真正体验底图(之前做过一些映射)。
from matplotlib.patches import Wedge
def draw_round_frame(m, width_percent=0.05, degree=45):
centre_x = (ax.get_xlim()[0] + ax.get_xlim()[1]) / 2
centre_y = (ax.get_ylim()[0] + ax.get_ylim()[1]) / 2
width = abs(centre_x) * width_percent
inner_radius = abs(centre_x) - width/2
outer_radius = inner_radius + width
angle_breaks = list(range(0, 361, degree))
for i, (from_angle, to_angle) in enumerate(list(zip(angle_breaks[:-1], angle_breaks[1:]))):
color='white' if i%2 == 0 else 'black'
wedge = Wedge((centre_x, centre_y), outer_radius, from_angle, to_angle, width=outer_radius - inner_radius,
facecolor=color,
edgecolor='black',
clip_on=False,
ls='solid',
lw=1)
ax.add_patch(wedge)
要使用,只需在 fig.show()
draw_round_frame(m)
plt.show()
它应该比实际更多地使用地图坐标,并且它与轴重叠,因为我目前无法想出在地图本身周围添加更多 space 的方法,但可能会给你一个想法开始。