我注意到Josh提供了一个可行的解决方案,但了解 为什么 map()
的行为与你描述的一样可能很有用。基本上,这取决于map()
在绘图时基于设备的当前尺寸和纵横比(更具体地说是图形区域)设置绘图区域的大小。
因此,一个解决方案是,在你重新调整设备大小后,只需在此之后重新绘制地图,而无需转换为另一种格式,就像Josh演示的那样。你可以根据par("usr")
的宽高比做一些计算,然后将设备设置为与该宽高比兼容的宽度,从而避免一些猜测。
可能比@Josh的解决方案更麻烦,但它确实解释了这种行为。下面给出了更详细的问题描述。
绘制的地图没有"填满"设备(直到指定的边距)的原因是map()
中的代码设置了绘图区域的大小,以保持正确的宽高比,基于设备的大小等因素。结果的绘图区域大小适合于在设备中适合,但是保留了正确的宽高比,因此可能不能完全填充它。
关键代码部分如下:
else {
par(mar = mar)
p <- par("fin") - as.vector(matrix(c(0, 1, 1,
0, 0, 1, 1, 0), nrow = 2) %*% par("mai"))
par(pin = p)
p <- par("pin")
p <- d * min(p/d)
par(pin = p)
d <- d * myborder + ((p/min(p/d) - d)/2)/aspect
usr <- c(xrange, yrange) + rep(c(-1, 1), 2) *
rep(d, c(2, 2))
par(usr = usr)
}
在稍早之前,d
已被定义为:
d <- c(diff(xrange), diff(yrange)) * (1 + 2 * myborder) *
aspect
(针对你给出的示例)else分支的第二行正在以英寸为单位获取图形区域的当前大小。图形区域是设备上包含边距和绘图区域但不包含任何外部边距的区域大小。实际上,如果没有外部边距处于活动状态,则此代码会抓取设备的大小(并进行调整)。然后,将此结果用于设置绘图区域的大小,从而更新该区域。
意图似乎是获取当前图形区域的大小,并使用它来更新绘制地图的区域。从这个意义上讲,绘图区域的大小通过设备的纵横比来控制;如果您从一个宽但短的窗口开始,则计算出的绘图区域不需要使用所有可用的宽度(如果使用了,则宽高比将错误),因此绘图区域设置为比可用空间小的尺寸。
至于为什么当您调整窗口大小时这不会更新,那是因为在绘制时,绘图区域的大小是以
英寸为单位绝对设置的。如果您调整设备大小,则绘图区域的大小保持不变,因此如果您缩小设备足够,地图会被裁剪,或者如果您扩大设备,则使用越来越少的设备空间。