Обратный сгруппированный барплот в R - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть данные для 35 участников, такие как where the first column is Ethnicity and the rest three columns are metabolites values

, где первый столбец - этническая принадлежность, а остальные три столбца - значения для трех метаболитов, мне нужно иметь столбец график как barplot of metabolites values

для каждого метаболита, сгруппированного по этнической принадлежности. Я пробовал разные способы, но они не увенчались успехом. Буду признателен, если вы сможете мне помочь.

Спасибо

1 Ответ

0 голосов
/ 21 апреля 2020

Для этого потребуется группа фиктивных данных по энзимам и этичности, чтобы суммировать и получить среднее значение столбца «значение», а затем составить график. В geom_col position = "dodge" может помочь создать "сгруппированные" столбцы, аordin_flip перевернет оси X и Y.

 library(tidyverse)
    #dummy data
    data <- tibble(participant = 1:30,
                   ethnicity = sample(c("e1", "e2"), 30, replace = T),
                   value = sample(-10:10, 30, replace = T),
                   enzyme = c(rep("enzyme1", 10), rep("enzyme2", 10), rep("enzyme3", 10)))
    #get mean value of 'value'
    data2 <- data %>% 
      group_by(enzyme, ethnicity) %>% 
      summarize(value = mean(value))

    ggplot()+
      geom_col(data = data2, aes(x = enzyme, 
                                y = value, 
                                fill = ethnicity),
               position = "dodge")+
      geom_hline(aes(yintercept = 0))+
      coord_flip()+
      theme_linedraw()

enter image description here

Кроме того, если ваши данные содержат значения фермента в 3 отдельных столбцах, вы должны преобразовать данные в длинный формат, используя pivot_longer чтобы упростить прорисовку:

data_wide <- tibble(ethnicity = c("ethnicity1", "ethnicity2"),
                    enzyme1 = c(-1, -2), 
                    enzyme2 = c(0, 0),
                    enzyme3 = c(1, 2))
    # A tibble: 2 x 4
  ethnicity   enzyme1 enzyme2 enzyme3
  <chr>        <dbl>   <dbl>   <dbl>
1 ethnicity1      -1       0       1
2 ethnicity2      -2       0       2


   #transform to long
data_long <- data_wide %>% 
  pivot_longer(starts_with("enzyme"), "enzyme")

# A tibble: 6 x 3
  ethnicity   enzyme  value
  <chr>      <chr>   <dbl>
1 ethnicity1 enzyme1    -1
2 ethnicity1 enzyme2     0
3 ethnicity1 enzyme3     1
4 ethnicity2 enzyme1    -2
5 ethnicity2 enzyme2     0
6 ethnicity2 enzyme3     2
...