如何在Python中设置底图的偏移量?

时间:2018-11-24 11:09:07

标签: python matplotlib-basemap

这是底图的一个示例:

fig = plt.figure(figsize=(10,6))

ax = fig.add_subplot(121)
ax.set_title('Default')

# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])

ax = fig.add_subplot(122)
ax.set_title('Add offset')

# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],xoffset=100,yoffset=100)
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],xoffset=100,yoffset=100)

我想在xlabel / ylabel和轴之间添加更多空间。 但是,当添加xoffsetyoffset时,空间较小。

example

2 个答案:

答案 0 :(得分:0)

basemap不再得到积极开发,但是维护仍会持续一段时间。这意味着由于其他软件包中的更改而导致中断的问题仍将得到解决,但是不会添加任何新功能。无论如何,固定部分可能要花费一些时间,我猜想平行线和子午线的xoffset功能正遭受这一痛苦。但是,查看basemap文档,将xoffsetyoffset的功能描述为

  

xoffset:沿x方向从地图边缘偏移的标签(默认值为0.01)   乘以地图投影坐标中地图的宽度)。

     

yoffset:标签   y方向上地图边缘的偏移量(默认值为高度的0.01倍)   地图投影坐标中的地图位置)。

通过操作Textdrawparallels()产生的drawmeridians()对象,可以很容易地模拟它。这些函数的结果存储在dict中,其中包含每个绘制的并行/子午线的列表元组,其中第二个包含文本标签。一个Text对象具有一个get_position()和一个set_position()方法,这些方法与轴限制和上述定义一起可以用于计算偏移量:

from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

fig = plt.figure(figsize=(10,6))

ax = fig.add_subplot(121)
ax.set_title('Default')

# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])

ax = fig.add_subplot(122)
ax.set_title('Add offset')

# miller projection
map = Basemap(projection='mill',lon_0=180)
# plot coastlines, draw label meridians and parallels.
map.drawcoastlines()

##getting axes dimensions
x0,x1 = ax.get_xlim()
w = x1-x0
y0,y1 = ax.get_ylim()
h = y1-y0

xoffset = 0.05
yoffset = 0.05

result = map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
##
for key, (lines,texts) in result.items():
    for text in texts:
        x,y = text.get_position()
        text.set_position((x0-xoffset*w,y))


result = map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])
for key, (lines,texts) in result.items():
    for text in texts:
        x,y = text.get_position()
        text.set_position((x,y0-yoffset*h))



plt.show()

结果图如下:

Result of the above code

答案 1 :(得分:0)

我认为您使用的单元不正确。 @ThomasKühn引用了底图文档:

xoffset:标签在x方向上从地图边缘的偏移量(默认为0.01) 地图投影坐标中乘以地图宽度)。

yoffset:标注在y方向上与地图边缘的偏移量(默认为0.01) 地图投影坐标中乘以地图高度)。

请注意,默认值为在地图投影坐标中测得的域范围的1%。

如果检查所用轧机投影的y轴跨度,则长度为8位数字,因此难怪yoffset=100不会给出视觉偏移。

因此,一种更简单的方法是使用实​​际域范围来修改偏移量,例如:

map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

这提供与默认值相同的偏移,即域跨度的1%(请参见下图(b))。将0.01更改为0.03将是该值的3倍(图(c))。

如果改用cyl投影(以纬度/经度为单位),则偏移量也以度为单位,那么yoffset=100将是疯狂的偏移量。图(f)使用yoffset=30,请注意,该距离与60S到90S的距离相同。

enter image description here

生成图形的脚本:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
fig = plt.figure(figsize=(12,6))

def drawMap(proj):
    map = Basemap(projection=proj,lon_0=180)
    map.drawcoastlines()
    return map

# miller projection
ax = fig.add_subplot(231)
ax.set_title('(a) Mill, Default')
map=drawMap('mill')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])

ax = fig.add_subplot(232)
ax.set_title('(b) Mill, add same offset as default')
map=drawMap('mill')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.01*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

ax = fig.add_subplot(233)
ax.set_title('(c) Mill, add 3x offset as default')
map=drawMap('mill')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.03*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.03*abs(map.ymax-map.ymin))

ax = fig.add_subplot(234)
ax.set_title('(d) Cyl, Default')
map=drawMap('cyl')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0])
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1])

ax = fig.add_subplot(235)
ax.set_title('(e) Cyl, add same offset as default')
map=drawMap('cyl')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.01*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=0.01*abs(map.ymax-map.ymin))

ax = fig.add_subplot(236)
ax.set_title('(f) Cyl, add 30 degree offset')
map=drawMap('cyl')
map.drawparallels(np.arange(-90,90,30),labels=[1,0,0,0],
        xoffset=0.03*abs(map.xmax-map.xmin))
map.drawmeridians(np.arange(map.lonmin,map.lonmax+30,60),labels=[0,0,0,1],
        yoffset=30)

fig.subplots_adjust(hspace=0.01)
fig.show()