这是底图的一个示例:
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和轴之间添加更多空间。
但是,当添加xoffset
和yoffset
时,空间较小。
答案 0 :(得分:0)
basemap
不再得到积极开发,但是维护仍会持续一段时间。这意味着由于其他软件包中的更改而导致中断的问题仍将得到解决,但是不会添加任何新功能。无论如何,固定部分可能要花费一些时间,我猜想平行线和子午线的xoffset
功能正遭受这一痛苦。但是,查看basemap
文档,将xoffset
和yoffset
的功能描述为
xoffset:沿x方向从地图边缘偏移的标签(默认值为0.01) 乘以地图投影坐标中地图的宽度)。
yoffset:标签 y方向上地图边缘的偏移量(默认值为高度的0.01倍) 地图投影坐标中的地图位置)。
通过操作Text
和drawparallels()
产生的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()
结果图如下:
答案 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的距离相同。
生成图形的脚本:
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()