[英]ggplot adding multiple geom_lines
我有一個數據框:
df <- data.frame(z = c(2,1,2,3,2,3,2,1,1,1,3,4,1,1,2,3,4,3),
x = c("a","a","a","a","a","a","b","b","b","b","b","b","c","c","c","c","c","c"),
cat = c("A","A", "B","B","C", "C", "A","A", "B","B","C","C","A","A", "B","B","C","C"))
在這里,我在 x (3 個類別:a、b、c)的 x 軸分類值上繪圖。 在 y 軸上,“z”中的值的平均值計算為:
all x="a" and cat="A"
all x="b" and cat="B"
all x="c" and cat="C"
library(tidyverse)
df %>%
group_by(cat,x) %>%
summarise(avg = mean(z)) %>%
ggplot(aes(x=x, y=avg, group=cat, color=cat)) +
geom_point() +
geom_line()
我想在 plot 中再添加一行,這是所有 3 只“貓”的平均值,並將其包含在圖例中。
在tidyverse
中,我們可以使用group_map
和add_row
來創建一個額外的行
library(dplyr)
library(tibble)
library(ggplot2)
df %>%
group_by(cat, x) %>%
summarise(avg = mean(z), .groups = 'drop') %>%
group_by(x) %>%
group_map(~ .x %>%
add_row(cat = 'mean', x = first(.x$x),
avg = mean(.x$avg) ), .keep = TRUE) %>%
bind_rows %>%
ggplot(aes(x=x, y=avg, group=cat, color=cat)) +
geom_point() +
geom_line()
-輸出
或者通過在第一次summarise
后使用summarise
屬性以簡潔的方式執行此操作,將“cat”和“avg”列中的附加行連接起來,然后使用 OP 帖子中的ggplot
代碼
df %>%
group_by(x, cat) %>%
summarise(avg = mean(z), .groups= 'drop_last') %>%
summarise(cat = c(cat, 'mean'),
avg = c(avg, mean(avg)), .groups = 'drop') %>%
ggplot(aes(x=x, y=avg, group=cat, color=cat)) +
geom_point() +
geom_line()
或者我們可以重塑為“寬”以獲得mean
並重塑回“長”
library(tidyr)
df %>%
pivot_wider(names_from = cat, values_from = z, values_fn = mean) %>%
mutate(mean = rowMeans(select(cur_data(), where(is.numeric)))) %>%
pivot_longer(cols = -x, names_to = 'cat', values_to = 'z') %>%
ggplot(aes(x=x, y=avg, group=cat, color=cat)) +
geom_point() +
geom_line()
或base R
選項
out <- xtabs(z ~ x + cat, df)/xtabs(z ~ x + cat, transform(df, z = 1))
out1 <- cbind(out, mean = rowMeans(out))
matplot(out1, type = 'l', col=c("blue","green","red", "black"), lty = 1:4)
legend('left', legend = colnames(out1), col=c("blue","green","red", "black"), lty = 1:4)
-輸出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.