gpt4 book ai didi

r - for 循环与 ggplots 生成具有相同值但不同标题的图形

转载 作者:行者123 更新时间:2023-12-05 00:56:13 33 4
gpt4 key购买 nike

我已经阅读了很多关于使用循环为 ggplot 生成大量图表的帖子,但找不到任何可以解释我的问题的帖子......

我有一个数据框,正在尝试遍历 92 列,为每列创建一个新图形。我想将每个图保存为一个单独的对象。当我运行我的循环(下面的代码)并打印图形时,所有图形都是正确的。但是,当我使用assign() 更改print() 命令时,图形不正确。标题正在发生变化,但图形值都是相同的(它们都是最终图形的值)。我发现了这一点,因为当我使用 plot_grid() 生成 10 个图时,图形标题和轴标签都是正确的,但值是相同的!

我的数据集很大,所以我提供了一个小数据集用于下面的说明。

示例数据名:

library(ggplot)
library(cowplot)
df <- as.data.frame(cbind(group=c(rep("A", 4), rep("B", 4)), a=sample(1:100, 8), b=sample(100:200, 8), c=sample(300:400, 8))) #make data frame
cols <- 2:4 #define columns for plots
for(i in 1:length(cols)){
df[,cols[i]] <- as.numeric(as.character(df[,cols[i]]))
} #convert columns to numeric

情节:
for (i in 1:length(cols)){
g <- ggplot(df, aes(x=group, y=df[,cols[i]])) +
geom_boxplot() +
ggtitle(colnames(df)[cols[i]])
print(g)
assign(colnames(df)[cols[i]], g) #generate an object for each plot
}

plot_grid(a, b, c)

我在想,当 ggplots 绘制绘图时,它只呈现 i 的最终值中的数据?或者类似的东西?有没有解决的办法?

我希望这样做,因为我希望制作很多图形,然后我想混合和匹配图形的图。

谢谢!

最佳答案

我已经清理了您生成示例数据框的方式。

library(ggplot2)
library(cowplot)

df <- data.frame(group=c(rep("A", 4), rep("B", 4)),
a=sample(1:100, 8),
b=sample(100:200, 8),
c=sample(300:400, 8)) #make data frame

仅使用 data.frame() 就足够了。这使您的代码更清晰,并避免了在“for 循环”中进行所有后处理以将数据帧转换为数字并删除生成的因素的需要 - 请注意 as.data.frame() 和 cbind() 倾向于默认如果您没有 'stringsAsFactors = FALSE' 并且可以通过使用 cbind.data.frame() 而不是 cbind() 来避免数字到字符的转换。

我还重构了生成绘图的“for 循环”。您生成一个名为 'cols' (cols <- 2:4 ) 的整数列表,然后重复这些整数以从每列数据生成图。这是不必要的,我们可以在 for 语句条件中创建一个范围 - 'for (i in 2:ncol(df))' - 这只是重复从 2 到 4(数据框中的列数) - 从 2 开始需要避免包含元数据的第 1 列。这是可取的,因为:

i) 在查看您的代码时,所使用的条件立即显而易见,而无需搜索您的代码的其余部分

ii) R 有许多函数/参数与您的变量“cols”相似,最好避免混淆。

清理代码后,我们现在可以尝试定位错误的原因:
library(ggplot2)
library(cowplot)

df <- data.frame(group=c(rep("A", 4), rep("B", 4)),
a=sample(1:100, 8),
b=sample(100:200, 8),
c=sample(300:400, 8)) #make data frame


for (i in 2:ncol(df)){

g <- ggplot(df, aes(x=group, y=df[,i])) +
geom_boxplot() +
ggtitle(colnames(df)[i])

print(g)
assign(colnames(df)[i], g) #generate an object for each plot
}

为什么您的代码不起作用并不是很明显。 Imo 的建议是有值(value)的。将您的绘图保存到列表中可以防止您的环境被对象弄得杂乱无章,但这并不能解决此错误。原因不直观,需要深入了解assign() 函数的计算方式。查看提供的答案 here来自 Konrad Rudolph .以下应该可以工作并保留原始代码的样式。正如康拉德在他的回答中所暗示的那样,使用 lapply 可能更像是“R”。请注意,我们已经给出了 for 循环的局部作用域,现在我们在局部重新定义了 i。以前,循环中生成的 i 的最后一个值用于生成通过assign() 函数创建的每个对象。请注意使用 <<- 将 g 分配给全局环境。
for (i in 2:ncol(df))  
local({
i <- i
g <<- ggplot(df, aes(x=group, y=df[,i])) +
geom_boxplot() +
ggtitle(colnames(df)[i])
print(i)
print(g)
assign(colnames(df)[i], g, pos =1) #generate an object for each plot
})

plot_grid(a, b, c)

你欠我一杯酒。

关于r - for 循环与 ggplots 生成具有相同值但不同标题的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36627085/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com