2011-03-02 20 views
7

我試圖擺脫在R中使用'maps'包生成的地圖的邊距。通過設置par(mar=c(0,0,0,0))並在邊框中使用選項border = 0, map()功能。但與例如與mar=c(0,0,0,0)散點圖仍然有很多額外的空間。這裏有一些代碼來生成一個示例地圖,以及一個用於比較的常規散點圖。在R中繪製無邊距的地圖

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()功能,你可以看到,即使有利潤名義上抑制,空間已經預留給軸。

任何想法非常讚賞,這已經讓我煩惱了很多年。

回答

9

在map函數中,mar被再次重置(因此不遵循常規設置)。您可以在地圖功能中設置邊距(請參閱?map)。這給你想要的東西:

map("world", border=0, ylim=c(-80, 80), fill=TRUE, 
    bg="gray", col="white",mar=rep(0,4)) 

在旁註,如果更改面值的常規設置,你可以像

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

東西的參數設置回原來的。如果您編寫自己的自定義繪圖函數,這特別有用。

+0

謝謝!有一點讓我很尷尬的是,答案總是出現在「地圖」中,但我比其他任何東西都更放心。 –

+0

@邁克爾:不客氣。不要打擾,很容易錯過顯而易見的事物。我自己曾多次犯過這種罪行;) –

+0

+1我遇到的問題是我沒有設置'border'屬性。 – seand

2

map()函數確實設置了邊距,所以在調用函數時指定它們會使邊距變化。但是,如果您還通過投影,則會忽略mar

所以,如果你這樣做

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