Matplotlib:在底图周围创建lat / lon白色/黑色圆形边界框

时间:2017-11-22 09:41:03

标签: python matplotlib matplotlib-basemap

我正在尝试更改我的matplotlib地图周围的默认框架的设计,用于lon / lat白色和黑色圆形边界框'框架的类型,例如,黑色从90度W延伸到45度W,白色从45W延伸到0度等。

为R用户开发了一个非常相似的代码(请参阅:http://menugget.blogspot.co.uk/2012/04/add-frame-to-map.html)以获取矩形地图,但我没有为Python用户找到任何内容。

有没有人知道Python中是否有允许这种类型的框架设计的包?

下面是我在python中绘制Antarctica的代码。代码下方的图显示了我想要实现的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()

enter image description here

1 个答案:

答案 0 :(得分:2)

我不确定这是否特别强大,但它适用于您的示例,并且是我第一次使用底图的实际体验(之前已完成了一些映射)。

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

round map frame

它应该比它更多地使用地图坐标,并且它与轴重叠,因为我目前无法想象一种在地图周围添加更多空间的方法,但可能会给你一个开头的想法。