[英]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.