Я пытаюсь построить карту Арктики в полярной стереографической проекции. Для этого я импортировал уже спроектированный шейп-файл в R с помощью пакета rGDAL:

ds <- readOGR(dsn = path, layer = "10m_coastline_ps")

Это создает SpatialLinesDataFrame. Теперь, когда я рисую этот SpatialLinesDataFrame с помощью функции plot(), я не могу установить пределы графика с помощью параметров xlim и ylim:

plot(ds, xlim=c(-1700000,1700000), ylim=c(-4000000,800000), axes=T)

Функция plot() автоматически устанавливает соотношение сторон на 1 и принудительно устанавливает пределы оси (как описано в этом сообщении: неправильно отображать оси xlim ylim). Это дает следующий сюжет:

enter image description here

Я попытался инициализировать экстент графика перед построением SpatialLinesDataFrame, как показано ниже:

mapExtentPr <- rbind(c(-1700000,-4000000), c(1700000,800000))
plot(mapExtentPr, pch=NA)
plot(ds, xlim=c(-1700000,1700000), ylim=c(-4000000,800000), axes=T, asp = 1, add=TRUE)

Это устанавливает правильные пределы, но не поддерживает соотношение сторон. Я также пробовал использовать функцию clip(), которая не дала результата.

Есть ли способ точно установить пределы сюжета при сохранении соотношения сторон 1 (без использования ggplot или spplot)?

Примечание. Я уже проверил этот ответ: Можно ли изменить ylim и xlim, когда график уже нарисован?

3
jatobat 26 Мар 2013 в 19:10
1
Помогает ли добавление pty = "s" либо к полному вызову plot из первого примера, либо к вызову plot(mapExtentPr, pch=NA) из второго примера? Дело здесь в том, чтобы сохранить квадратную область построения, иначе невозможно будет принудительно установить 1asp = 1 и контролировать пределы оси. Даже если область построения квадратная, вы не сможете добиться идеального результата. Другой вариант - изменить масштаб окна построения графика до тех пор, пока вы не достигнете желаемых пределов.
 – 
Gavin Simpson
26 Мар 2013 в 20:32
Спасибо за предложения. К сожалению, добавление pty = "s" не работает, так как мне понадобится неквадратная область. Изменение масштаба окна построения графика работает нормально, но я искал автоматическую процедуру. Думаю, я, вероятно, сделаю это с помощью ggplot или spplot ...
 – 
jatobat
26 Мар 2013 в 20:59
1
Если вам нужно соотношение сторон 1 и заданные пределы, вам необходимо установить размеры графика. Как еще это было бы возможно? Вы можете открыть новое устройство с определенным размером в базе R. Если ggplot и spplot могут это сделать, то, возможно, вы могли бы объяснить, как это сделать в ответе? Вы можете ответить на свой вопрос примерно через день.
 – 
Gavin Simpson
26 Мар 2013 в 21:05

1 ответ

Лучший ответ

В итоге я использовал это:

xmin <- -1700000
xmax <- 1700000
ymin <- -4000000
ymax <- 100000

asratio = (ymax-ymin)/(xmax-xmin)

png("greenland_map.png",width=500,height=ceiling(500*asratio))

#plot basemap
plot(ne_10m_coastline_ps,xlim=c(xmin,xmax), ylim=c(ymin,ymax),
     axes=TRUE,asp=1,xaxs="i",yaxs="i")

par(usr=c(xmin,xmax,ymin,ymax))

dev.off()

map with exact axis limits

3
jatobat 26 Апр 2013 в 02:12