Рисование карт без полей в R - PullRequest
7 голосов
/ 02 марта 2011

Я пытаюсь избавиться от полей карт, созданных с помощью пакета 'maps' в R. Я получаю некоторые из них, устанавливая par(mar=c(0,0,0,0)) и используя опцию border = 0 в функции map(),Но по сравнению, например, с диаграммой рассеяния с 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 голосов
/ 02 марта 2011

В функции карты mar снова сбрасывается (и, следовательно, не соответствует общим настройкам). Вы можете установить поля в функции карты (см. ?map). Это дает то, что вы хотите:

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

на sidenote, если вы измените общие настройки номинала, вы можете сделать что-то вроде

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

для возврата параметров к оригиналу. Это особенно полезно, если вы пишете свои собственные функции печати. ​​

2 голосов
/ 22 апреля 2015

Функция 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...