2012-04-18 5 views
1

Я собрал пример с игрушкой ниже.Добавить береговую линию при построении граненных массивов в R с помощью ggplot2

Мой вопрос, как я могу добавил береговые (так же, как вы можете получить от maps пакета ограненных участков ниже?

Я могу сделать это с contour() и filled.contour(), но я не уверен, как при использовании фасетов слоев идти об этом с ggplot2 -style черчения. у меня нет никаких проблем замышляют побережья, когда у меня есть один сюжет.

Вы можете скачать NetCDF файл «sst.mon.anom.nc» из NOAA here (~ 10 мб).

library(ncdf4) 
library(ggplot2) 
library(reshape) 

# The data is 5x5 degree reconstructed sea-surface temperature anomalies. 
# Exciting stuff. 
sst <- ncvar_get(nc = nc_open("sst.mon.anom.nc"), 
       varid = "sst", 
       start = c(1, 1, 1), 
       count = c(-1, -1, -1)) 

# Drawing out four layers from the sst array. 
d1 <- melt(sst[, , 1]) 
d1$drought <- rep("d1", dim(d1)[1]) 
d3 <- melt(sst[, , 3]) 
d3$drought <- rep("d3", dim(d3)[1]) 
d5 <- melt(sst[, , 5]) 
d5$drought <- rep("d5", dim(d5)[1]) 
d6 <- melt(sst[, , 6]) 
d6$drought <- rep("d6", dim(d6)[1]) 

# Combining the layers into a single data.frame: 
d <- rbind(d1, d3, d5, d6) 
names(d) <- c("lon", "lat", "ERSST", "layer") 

p <- ggplot(data = d, aes(x = lon, y = lat, fill = ERSST)) 
print(p + geom_tile() + 
     scale_fill_gradient2(high = "red", low = "blue") + 
     facet_wrap(~ layer)) 

Output from the above script

Большое спасибо!

P.S. Кроме того, я просто заметил, что упорядочение цветовой легенды перевернуто. Hmm ...

+0

Есть ли уловка для установки библиотеки 'ncdf4'? При попытке установить следующее сообщение: «ERROR: сбой конфигурации для пакета« ncdf4 »и« установка пакета «ncdf4» имела ненулевой статус выхода ». – Jubbles

+0

Это может быть проблема зависимости. Я считаю, что он использует библиотеку netcdf> 4.1 как системное требование. http://cran.r-project.org/web/packages/ncdf4/index.html – brews

+0

@Brews просто сохраняет данные, используя 'save', что должно позволить другим людям использовать' load', чтобы загрузить его в их рабочее пространство. –

ответ

1

Красота ggplot2 заключается в том, что нет необходимости выполнять определенную операцию для каждого фасета. Просто добавил geom_path с data data.frame, который содержит береговые линии, будет рисовать его на всех грани. См. the documentation of coord_map на примере использования geom_path с набором многоугольников из пакета maps. Обратите внимание, что если и только если ваши данные сетки и данные полигона/полилинии находятся в одной проекции, это будет работать. Через coord_mapggplot2 поддерживает преобразования координат из коробки. В качестве альтернативы вы можете использовать spTransform из пакета rgdal для выполнения преобразования координат перед подачей данных в ggplot2 (я, как правило, это делаю).

+0

Да, это то, что я делаю, когда рисую в ggplot2 без огранки. Но когда огранение, не будет ли данных по побережью, нужна ли какая-то переменная, которую я украшаю? – brews

+0

Нет, если переменная, с которой вы сталкиваетесь, отсутствует в карте 'data.frame', она будет отображать одну и ту же карту на всех грани. Вы можете определить переменную, которой вы обладаете огранкой, позволяя рисовать разные карты на разных гранях. Но если вы хотите нарисовать одну и ту же карту повсюду, это не нужно. –

 Смежные вопросы

  • Нет связанных вопросов^_^