在 for 循环中使用 ggplot() 绘制和保存多个栅格
Plot and save of multiple rasters using ggplot() in a for loop
我正在尝试打开、绘制多个光栅并将其保存到图像文件中。为此,我写了这个脚本:
library(raster)
library(rgdal)
library(ggplot2)
library(dplyr)
species <- read.csv(file = 'C:/species.csv', sep=";")
for (sp.n in colnames(species)) {
rsts <- raster(paste('C:/rasters/', sp.n, '.grd', sep=''))
rsts_df <- as.data.frame(rsts, xy = TRUE)
names(rsts_df)[3] <- sp.n
ggplot() +
geom_raster(data = rsts_df, aes(x = x, y = y, fill = sp.n), na.rm = TRUE) +
scale_fill_gradient(low = "white", high = "violetred4") +
coord_quickmap()
ggsave(paste('C:/imgs/', sp.n, '.png', sep=''))
}
但是,我收到这条消息:
Error: Discrete value supplied to continuous scale
问题是,如果我在循环外为每个栅格单独绘制绘图,它就可以工作。我相信这与 'fill = sp.n' 有关。你知道我做错了什么吗?
虽然 运行 循环中的代码,您的 "sp.n"
是一个字符,而 ggplot2
则采用未加引号的裸名称 sp.n
。例如,如果您 运行 代码:
library(ggplot2)
ggplot() +
geom_raster(data = rsts_df, aes(x = x, y = y, fill = "col.name"), na.rm = TRUE)
你可能会遇到同样的错误。相反,您应该使用 fill = .data[[sp.col]]
ggplot() +
geom_raster(data = rsts_df,
aes(x = x, y = y, fill = .data[[sp.n]]),
na.rm = TRUE)
这一切都是基于整洁评估的概念。您可以在“Programming with dplyr”
上阅读更多相关信息
我正在尝试打开、绘制多个光栅并将其保存到图像文件中。为此,我写了这个脚本:
library(raster)
library(rgdal)
library(ggplot2)
library(dplyr)
species <- read.csv(file = 'C:/species.csv', sep=";")
for (sp.n in colnames(species)) {
rsts <- raster(paste('C:/rasters/', sp.n, '.grd', sep=''))
rsts_df <- as.data.frame(rsts, xy = TRUE)
names(rsts_df)[3] <- sp.n
ggplot() +
geom_raster(data = rsts_df, aes(x = x, y = y, fill = sp.n), na.rm = TRUE) +
scale_fill_gradient(low = "white", high = "violetred4") +
coord_quickmap()
ggsave(paste('C:/imgs/', sp.n, '.png', sep=''))
}
但是,我收到这条消息:
Error: Discrete value supplied to continuous scale
问题是,如果我在循环外为每个栅格单独绘制绘图,它就可以工作。我相信这与 'fill = sp.n' 有关。你知道我做错了什么吗?
虽然 运行 循环中的代码,您的 "sp.n"
是一个字符,而 ggplot2
则采用未加引号的裸名称 sp.n
。例如,如果您 运行 代码:
library(ggplot2)
ggplot() +
geom_raster(data = rsts_df, aes(x = x, y = y, fill = "col.name"), na.rm = TRUE)
你可能会遇到同样的错误。相反,您应该使用 fill = .data[[sp.col]]
ggplot() +
geom_raster(data = rsts_df,
aes(x = x, y = y, fill = .data[[sp.n]]),
na.rm = TRUE)
这一切都是基于整洁评估的概念。您可以在“Programming with dplyr”
上阅读更多相关信息