Создайте диаграмму par () с картами из 4 различных растровых стеков в R в цикле - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть четыре растровых стека, каждый из которых содержит 228 слоев.Я хочу построить первый шаг каждого стека на графике панели, используя пар (2,2) в R, и, наконец, произвести 228 графиков, каждый из которых содержит 4 карты.Я хочу сделать это с помощью цикла, но это то, что я дошел до этого.Не могли бы вы помочь мне?

> to_dates = seq(as.Date('1990-01-01'), as.Date('2008-12-31'), by='month')
> dts <- format(as.Date(to_dates), "%Y-%m")
> #
> ex = expression(m^3 / m^-3)
> #
> for(k in 1:length(dts)){
> par(mfrow = c(2,2))
> #
> png(filename = paste("erai_land_soil_moisture_", dts[k], ".png", sep=""), width = 800, height = 800)
> setwd("F:/.../layer1")
> for(i in 1:length(file_list1@layers)){   
> file_name = paste(names(file_list1)[i], "_layer1.png", sep="")  png(file_name, width = 800, height = 800)   
> plot(file_list1[[i]], 
> main = "ERA-Interim/Land: Volumetric soil water - Layer 1: 0-7cm",  
>       cex.main = 0.8, 
>       sub = paste(dts[i]),
>       cex.main = 1.7, 
>       cex.sub = 1.8, col = clrs,  
>       legend.shrink=1, legend.width=1, zlim=c(from=0, to=0.5))   grid.text(ex, x=unit(0.96, "npc"), y=unit(0.96, "npc"), just=1, rot=
> 0, gp=gpar(fontsize=13))   plot(afr, add=T)   dev.off() 
>}
> setwd("F:/.../layer2")
> for(i in 1:length(file_list2@layers)){   
> file_name = paste(names(file_list2)[i], "_layer2.png", sep="")     png(file_name, width = 800, height = 800)   
> plot(file_list2[[i]], main =
> "ERA-Interim/Land: Volumetric soil water - Layer 2: 7-21cm",  
>       sub = paste(dts[i]),
>       cex.main = 1.7, 
>       cex.sub = 1.8, col = clrs,
>       legend.shrink=1, legend.width=1, zlim=c(from=0, to=0.5))   grid.text(ex, x=unit(0.96, "npc"), y=unit(0.96, "npc"), just=1, rot=
> 0, gp=gpar(fontsize=13))   plot(afr, add=T)   dev.off()
> }
> setwd("F:/.../layer3")
> for(i in 1:length(file_list3@layers)){   
> file_name = paste(names(file_list3)[i], "_layer3.png", sep="")   > png(file_name, width = 800, height = 800)   
> plot(file_list3[[i]], 
> main = "ERA-Interim/Land: Volumetric soil water - Layer 3: 21-72cm",  
>       cex.main = 0.8, 
>       sub = paste(dts[i]),
>       cex.main = 1.7, 
>       cex.sub = 1.8, col = clrs, 
>       legend.shrink=1, legend.width=1, zlim=c(from=0, to=0.5))   grid.text(ex, x=unit(0.96, "npc"), y=unit(0.96, "npc"), just=1, rot=
> 0, gp=gpar(fontsize=13))   plot(afr, add=T)   dev.off() 
>}
> setwd("F:/.../layer4")
> for(i in 1:length(file_list4@layers)){   
> file_name = paste(names(file_list4)[i], ".png", sep="")   
> png(file_name, width = 800, height = 800)   plot(file_list4[[i]], 
> main = "ERA-Interim/Land: Volumetric soil water - Layer 4:  72-189cm",  
>       cex.main = 0.8, 
>       sub = paste(dts[i]),
>       cex.main = 1.7, 
>       cex.sub = 1.8, col = clrs,  
>       legend.shrink=1, legend.width=1, zlim=c(from=0, to=0.5))   grid.text(ex, x=unit(0.96, "npc"), y=unit(0.96, "npc"), just=1, rot=
> 0, gp=gpar(fontsize=13))   plot(afr, add=T)   dev.off() 
>}
> #
> title(paste(dts[k], "ERA-Interim/Land Soil Moisture", sep=""), cex.main=1.9, outer=TRUE)
> #
> dev.off()
> #
> }

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Если вы задаете вопрос R здесь, вы всегда должны включать некоторые простые примеры данных.Не код, который ссылается на ваши реальные данные и часто является ненужным сложным для рассматриваемого вопроса;потому что у нас нет этих данных (и я не хочу загружать);потому что это часто помогает вам решить вашу собственную проблему, упрощая вещи;и это облегчает ответ на ваш вопрос.

Пример данных

library(raster)
s1 <- stack(system.file("external/rlogo.grd", package="raster")) 
s2 <- flip(s1, 'y')
s3 <- flip(s1, 'x')
s4 <- (s1 + s2 + s3) / 3

Здесь можно посмотреть на результаты без записи файлов.Конечно, вы можете добавить аргументы в функцию plot, чтобы улучшить ее.

par(mfrow=c(2,2), ask=TRUE)
for (i in 1:nlayers(s1)) {
    plot(s1, i)
    plot(s2, i)
    plot(s3, i)
    plot(s4, i)
}

Если вы хотите одну легенду, проще всего использовать spplot

par(mfrow=c(2,2), ask=TRUE)
for (i in 1:nlayers(s1)) {
    x <- stack(s1[[i]], s2[[i]], s3[[i]], s4[[i]])
    print(spplot(x))
}

Для записи в файлы

path <- tempdir()
path
par(mfrow=c(2,2), ask=TRUE)
for (i in 1:nlayers(s1)) {
    png(file.path(path, paste0("map_", i, ".png")))
    x <- stack(s1[[i]], s2[[i]], s3[[i]], s4[[i]])
    print(spplot(x))
    dev.off()
}
list.files(path, pattern=".png$")
# and look at them in "path"
0 голосов
/ 27 сентября 2018

Очень сложно следовать вашему коду из-за форматирования.Я размещу шаблон для вашей задачи.

# assuming that your rasters are stored in file_list3
for(k in 1:length(dts)) {
    # Here code for file name generation
    f_name = paste("erai_land_soil_moisture_", dts[k], ".png", sep="") # replace if needed
    # Initiate png device
    png(f_name, width = 800, height = 800)
    par(mfrow = c(2, 2))

    # iterate over each raster
    for (i in c(1:4)){
        # Prepare titles and anything else
        # ... your code ...

        # Actual plotting
        plot(file_list3[i][[k]])  # raster i, layer k; add necessary arguments

        # Here goes anything else (legend an so on)
        # ... your code ...

        # Close device
        dev.off()
    }
}

Надеюсь, это поможет.

Кстати, не используйте setwd для целевой папки.Просто создайте путь к файлу пропппера:

f_name = paste("path/to/folder/", "erai_land_soil_moisture_", dts[k], ".png", sep="")
...