我已经组合了一个简单的for循环来生成一系列图,然后使用grid.arrange来绘制它们。我有两个问题:
图表的轴正确更改为列名称,但相同的数据在每个图表上绘制。放入断点并逐步执行代码后,它似乎正在递增,因此我不确定原因。
我已经将情节美学设置为年度组,但是这会产生出现在传奇中的5年。这在我以前没发生过。
应该使用mtcars
重现所有内容。
library(ggplot2)
library(gridExtra)
result <- mtcars
for(i in 1:2) {
nam <- paste("p", i, sep = "")
assign(
nam, ggplot(result, aes(x = disp, y = results[i+4], group = gear, color = gear)) +
geom_line() +
geom_point() +
scale_colour_distiller(palette = "Dark2", direction = -1, guide = "legend") +
scale_y_continuous(name = colnames(results[i+4])) +
scale_x_continuous(name = "x")
)
}
plist <- mget(paste0("p", 1:2))
do.call(grid.arrange, plist)
答案 0 :(得分:2)
我认为尝试通过aes
映射中的数字来访问列是令人困惑的ggplot。这有效:
for(i in 1:2) {
nam <- paste("p", i, sep = "")
assign(
nam, ggplot(result,aes_string(x="disp",y=colnames(result)[i+4], group="gear", color="gear")) +
geom_line() +
geom_point() +
scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
scale_y_continuous(name=colnames(result[i+4])) +
scale_x_continuous(name="x")
)
}
我建议迭代这些名字;这使代码更清晰。这是一个执行此操作并绕过环境绕行的版本:
plots <- lapply(c("drat", "wt"), function(column) {
ggplot(result,aes_string(x="disp",y=column, group="gear", color="gear")) +
geom_line() + geom_point() +
scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
scale_y_continuous(name=column) +
scale_x_continuous(name="x")}) %>%
do.call(grid.arrange, .)
do.call(grid.arrange, plots)
答案 1 :(得分:0)
您使用的结果和结果。你应该使用aes_string,然后按字符串名称引用变量:
你还应该避免做大量的作业。把它全部放入一个列表()
library(ggplot2)
library(gridExtra)
result<-mtcars
for(i in 1:2) {
nam <- paste("p", i, sep = "")
assign(
nam, ggplot(result,aes_string(x="disp",y=names(result)[i+4], group="gear", color="gear")) +
geom_line() +
geom_point() +
scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
scale_y_continuous(name=colnames(result[i+4])) +
scale_x_continuous(name="x")
)
}
plist <- mget(paste0("p", 1:2))
do.call(grid.arrange, plist)
答案 2 :(得分:0)
问题是绘图是在for循环中生成的,但是在do.call中进行了评估。由于ActionResult
在for循环中已更改,因此都会使用Result.ContentType
进行评估。您可以通过以下方式确认:
i
对代码进行小幅调整可以解决问题:
i = 2
答案 3 :(得分:0)
您应该充分利用ggplot::facet_wrap
这意味着将您的数据整理到可解释为ggplot的单个数据框
数据强>
temp <- mtcars
整洁的数据
library(purrr)
library(dplyr)
Names <- map_chr(1:2, ~names(temp)[.x+4])
# "drat" "wt"
data <- map_df(1:2, ~temp[,c("cyl", names(temp)[.x+4])] %>% setNames(c("cyl", "value")), .id="iteration") %>%
mutate(iteration = Names[as.numeric(iteration)])
使用facet_wrap绘图
ggplot(data=data, aes(x=cyl, y=value, label=iteration)) +
geom_line() +
geom_point() +
facet_wrap(~iteration)