Я пытаюсь построить карту Арктики в полярной стереографической проекции. Для этого я импортировал уже спроектированный шейп-файл в 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). Это дает следующий сюжет:
Я попытался инициализировать экстент графика перед построением 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, когда график уже нарисован?
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()
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.
pty = "s"
либо к полному вызовуplot
из первого примера, либо к вызовуplot(mapExtentPr, pch=NA)
из второго примера? Дело здесь в том, чтобы сохранить квадратную область построения, иначе невозможно будет принудительно установить 1asp = 1 и контролировать пределы оси. Даже если область построения квадратная, вы не сможете добиться идеального результата. Другой вариант - изменить масштаб окна построения графика до тех пор, пока вы не достигнете желаемых пределов.pty = "s"
не работает, так как мне понадобится неквадратная область. Изменение масштаба окна построения графика работает нормально, но я искал автоматическую процедуру. Думаю, я, вероятно, сделаю это с помощьюggplot
илиspplot
...