簡體   English   中英

ggplot添加多個geom_lines

[英]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 只“貓”的平均值,並將其包含在圖例中。

你可以使用rbind

rbind(
  df %>% group_by(cat,x) %>% 
         summarise(avg = mean(z)),
  df %>% group_by(cat='Mean',x) %>% 
    summarise(avg = mean(z))) %>% 
  ggplot(aes(x=x, y=avg, group=cat, color=cat)) + 
  geom_point() +
  geom_line()

在此處輸入圖像描述

tidyverse中,我們可以使用group_mapadd_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM