如何调整地图大小以填充绘图窗口?

时间:2014-02-18 19:21:09

标签: r plot

我开始使用R的map()函数绘制地图。我注意到,当我调整绘图窗口的大小时,图像不会缩放以填充窗口。如何让地图图像自动调整大小,取决于我拖动窗口的大小?

我在MacOS上使用R版3.0.2。

例如,这是一个地图,我拖动绘图窗口越来越大。请注意,地图图像的大小不会改变。

library(maps)
map("state")

enter image description here

enter image description here

enter image description here

另一方面,通常的plot()命令调整图形大小以适合窗口。

plot(1:100, 201:300)

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:6)

这需要一些工作,但通过将maps对象转换为SpatialPolygonsDataFrame,然后转换spplot(),您可以获得动态调整大小的地图。

FWIW,我怀疑这更好用,因为spplot()基于网格(通过网格),并且网格图形系统支持更复杂的方式处理绘图对象中的尺寸比R的基本图形系统。

library(maps)
library(maptools)  ## For map2SpatialPolygons()

## Convert data from a "maps" object to a "SpatialPolygonsDataFrame" object
mp <- map("state", fill = TRUE, plot = FALSE)
SP <- map2SpatialPolygons(mp, IDs = mp$names, 
                          proj4string = CRS("+proj=longlat +datum=WGS84"))
DATA <- data.frame(seq_len(length(SP)), row.names = names(SP))
SPDF <- SpatialPolygonsDataFrame(SP, data = DATA)

## Plot it
spplot(SPDF, col.regions = "transparent", colorkey = FALSE,
       par.settings = list(axis.line = list(col = "transparent")))

以下是一些截图,表明它有效:

enter image description here

enter image description here

答案 1 :(得分:3)

我注意到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分支的第二行是以英寸为单位获取图形区域的当前大小。图形区域是包含边距和绘图区域的区域设备上的尺寸,但任何外边距。实际上,如果没有外边距处于活动状态,则此代码将获取设备的大小(并进行调整)。然后使用此结果设置绘图区域的大小,该区域将更新。

目的似乎是取当前图形区域的大小,并使用它来更新绘制地图的区域。在该意义上,该绘图区域的大小通过设备的纵横比来控制;如果你从一个宽而短的窗口开始,那么计算的绘图区域将不需要使用所有可用的宽度(如果它的宽高比确实是错误的),因此绘图区域被设置为小于可用空间的尺寸

为什么在调整窗口大小时这不会更新,这是因为在绘制时,绘图区域的大小设置为绝对 英寸 。如果您调整设备的大小,绘图区域的大小将保持不变,因此如果您充分缩小设备,则会裁剪地图,或者如果放大设备,则会使用越来越少的设备空间。