为双重嵌套 lapply 中的多条回归线添加颜色
Adding color to multiple regression lines in a doubly nested lapply
我正在尝试在面板中的每个图上绘制多条回归线图。到目前为止,我可以得到每个面板的标题和每个面板中的回归线。但是,我在为回归线添加颜色时遇到了一些问题。
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000), col2 = rep(1:4, 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
colorlist <- c("red", "green", "blue", "orange")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y){
abline(lm(value ~ q, newsplit[[y]], col = colorlist[y]))
})})
但是,我收到警告说代码不知道如何处理 col 参数,所以它忽略了它。我该如何修正我的逻辑?
是的,我知道我可以使用 ggplot2,但我正试图在基础图形中弄明白。
编辑:好的,新问题。我正在将 factor2 更改为单词而不是数字,这样:
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000),
col2 = rep(c("one","two","three","four"), 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
library(RColorBrewer)
colorlist <- brewer.pal(4, "Set1")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y) {
abline(lm(value ~ q, newsplit[[y]]), col = colorlist[as.integer(y)])
})})
这会生成 12 个此类警告:
1: In int_abline(a = a, b = b, h = h, v = v, untf = untf, ... :
NAs introduced by coercion
所以该解决方案仅适用于当因子是数字字符串而不是字符串时。我该如何纠正?
我能以某种方式弄清楚你最后一行中的 y
是字符,因此不能用作索引。一个简单的解决方法是将其转换为整数。
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000), col2 = rep(1:4, 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
colorlist <- c("red", "green", "blue", "orange")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y){
abline(lm(value ~ q, newsplit[[y]]), col = colorlist[as.integer(y)])
})})
我正在尝试在面板中的每个图上绘制多条回归线图。到目前为止,我可以得到每个面板的标题和每个面板中的回归线。但是,我在为回归线添加颜色时遇到了一些问题。
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000), col2 = rep(1:4, 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
colorlist <- c("red", "green", "blue", "orange")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y){
abline(lm(value ~ q, newsplit[[y]], col = colorlist[y]))
})})
但是,我收到警告说代码不知道如何处理 col 参数,所以它忽略了它。我该如何修正我的逻辑?
是的,我知道我可以使用 ggplot2,但我正试图在基础图形中弄明白。
编辑:好的,新问题。我正在将 factor2 更改为单词而不是数字,这样:
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000),
col2 = rep(c("one","two","three","four"), 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
library(RColorBrewer)
colorlist <- brewer.pal(4, "Set1")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y) {
abline(lm(value ~ q, newsplit[[y]]), col = colorlist[as.integer(y)])
})})
这会生成 12 个此类警告:
1: In int_abline(a = a, b = b, h = h, v = v, untf = untf, ... :
NAs introduced by coercion
所以该解决方案仅适用于当因子是数字字符串而不是字符串时。我该如何纠正?
我能以某种方式弄清楚你最后一行中的 y
是字符,因此不能用作索引。一个简单的解决方法是将其转换为整数。
set.seed(1)
abc.df <- data.frame(col1 = rep(c("a", "b", "c"), 1000), col2 = rep(1:4, 750),
col3 = rnorm(3000), col4 = rnorm(3000, 2))
names(abc.df) <- c("factor1", "factor2", "q", "value")
abc.df$factor1 <- as.factor(abc.df$factor1)
abc.df$factor2 <- as.factor(abc.df$factor2)
abc_list <- split(abc.df, abc.df$factor1)
namelist <- names(abc_list)
colorlist <- c("red", "green", "blue", "orange")
par(mfrow = c(1, 3))
lapply(names(abc_list), function(x) {
plot(abc_list[[x]]$q, abc_list[[x]]$value, pch = 20,
col = adjustcolor(colorlist, alpha = 0.3),
xlab = "q", ylab = "Value", main = x);
newsplit <- split(abc_list[[x]], abc_list[[x]]$factor2);
lapply(names(newsplit), function(y){
abline(lm(value ~ q, newsplit[[y]]), col = colorlist[as.integer(y)])
})})