在R中绘制无边距的地图

7

我正在尝试消除使用R中“maps”包生成的地图的边距。通过设置par(mar = c(0,0,0,0))并在map()函数中使用border = 0选项,我可以完成部分工作。但与例如mar = c(0,0,0,0)的散点图相比,仍有很多额外的空间。下面是一些代码,用于生成示例地图以及常规散点图进行比较。

library(maps)
x <- sample(360, 10)-180
y <- sample(160, 10)-80
x.boundary <- c(-180, 180, 0, 0)
y.boundary <- c(0, 0, -80, 80)

pdf("map.tmp.pdf", width=9, height=4)
par(mar=rep(0,4))
map("world", border=0, ylim=c(-80, 80), fill=TRUE, bg="gray", col="white")
points(x, y, pch=19, col="blue")
points(x.boundary, y.boundary, pch=19, col="red")
# map.axes()
dev.off()

pdf("scatter.tmp.pdf", width=9, height=4)
par(mar=rep(0,4))
plot(x, y, xlim=c(-180, 180), ylim=c(-80, 80), pch=19, col="blue")
points(x.boundary, y.boundary, pch=19, col="red")
dev.off()

如果您取消注释map.axes()函数,您会发现即使边距被理论上抑制,空间仍然为轴保留。
非常感谢您的任何建议,这已经困扰我很长时间了。
2个回答

9
在map函数中,mar再次被重置(因此不遵循通用设置)。您可以在map函数内设置边距(请参见?map)。这将得到您想要的结果:
map("world", border=0, ylim=c(-80, 80), fill=TRUE, 
     bg="gray", col="white",mar=rep(0,4))

顺便提一下,如果您更改了par的常规设置,则可以执行以下操作:

oldpar <- par(mar=rep(0,4)
... some plotting ...
par(oldpar)

将参数设置回原始值。如果您编写自己的自定义绘图函数,则此功能特别有用。


谢谢!有点尴尬的是,答案一直在?map里面,但我感到更加宽慰而不是其他什么。 - Michael Dunn
@Michael:不用客气。别担心,很容易忽略掉显而易见的事情。我自己也犯过这种错误,不止一次 ;) - Joris Meys
我遇到的问题是我没有设置border属性。 - seand

2
map("mapid").setView([51.505, -0.09], 13);

Then the margins will be set to their default values. But if you specify margins like this:

map("mapid", {margin: "50px"}).setView([51.505, -0.09], 13);

Then the margins will be set to 50 pixels.

map("county", fill = TRUE, resolution = 0, lty = 0, 
    projection = "polyconic", 
    myborder = 0, mar = c(0,0,0,0))

边距不会改变。

为了纠正这个问题,您需要更改maps()函数并添加一行代码。

旧函数:

...
if (coordtype != "spherical" || doproj) {
    plot.window(xrange, yrange, asp = 1/aspect[1])
} else {
...

改为:

...
if (coordtype != "spherical" || doproj) {
    par(mar = mar)
    plot.window(xrange, yrange, asp = 1/aspect[1])
} else {
...

我从CRAN下载了源代码,并在修改后使用RStudio重新构建了库,以便今后调用maps()时带有projection参数仍然允许指定mar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接