[英]ggplot2 - Adding a line to a bar graph in a loop
我有以下数据框:
ID <- c('1P', '1P', '1P', '2P', '2P', '2P', '3P', '3P', '3P')
Visit <- c('V1','V2','V3','V1','V2','V3','V1','V2','V3')
var1 <- c(100, 150, 125, 75, 90, 100, 50, 60, 110)
var2<-c(1.1, 0.8,0.7, 1, 0.5, 0.2, 1.8, 0.8, 0.3)
df<- data.frame(ID, Visit, var1, var2)
我已经为 plot 编写了一个循环,每个 ID 的每次访问时 var1 的条形图。
df_split <- split(df, df$ID)
lapply(df_split, function(df) {ggplot(df, aes(x=Visit, y=var1)) +geom_col()})
我想:
我努力了:
lapply(df_split, function(df) {ggplot(NULL) + geom_col(aes(x=Visit, y=var1)) + geom_line(aes(x=Visit, y=var2))})
但是,这似乎不起作用,条形图似乎都与 plot 相同的数据。 我完全不确定如何将标题添加到循环中。
非常感谢您的宝贵时间!
通常不建议使用两个 y 轴(原因),但如果你真的想要,你可以调整这个答案来解决你的问题,例如
library(ggplot2)
ID <- c('1P', '1P', '1P', '2P', '2P', '2P', '3P', '3P', '3P')
Visit <- c('V1','V2','V3','V1','V2','V3','V1','V2','V3')
var1 <- c(100, 150, 125, 75, 90, 100, 50, 60, 110)
var2<-c(1.1, 0.8,0.7, 1, 0.5, 0.2, 1.8, 0.8, 0.3)
df<- data.frame(ID, Visit, var1, var2)
df_split <- split(df, df$ID)
#lapply(df_split, function(df) {ggplot(df, aes(x=Visit, y=var1)) +geom_col()})
lapply(df_split, function(df) {
ylim.prim <- c(0, 150)
ylim.sec <- c(0, 2)
var1 <- df$var1
b <- diff(ylim.prim)/diff(ylim.sec)
fit = lm(b ~ . + 0,
tibble::tribble(
~a, ~s, ~b,
1, (ylim.sec[1] - mean(var1))/sd(var1), ylim.prim[1],
1, (ylim.sec[2] - mean(var1))/sd(var1), ylim.prim[2]))
a <- fit$coefficients['a']
s <- fit$coefficients['s']
ggplot(df) +
geom_col(aes(x=Visit, y=var1)) +
geom_line(aes(x=Visit, y= a + ((var2 - mean(var1))/sd(var1)) * s), group=1) +
scale_y_continuous("var1",
limits = ylim.prim,
sec.axis = sec_axis(~ (. - a) / s * sd(var1) + mean(var1),
name = "var2")) +
labs(title = df$ID)
})
#> $`1P`
#>
#> $`2P`
#>
#> $`3P`
由reprex package (v2.0.1) 于 2022 年 8 月 18 日创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.