Добавление полос ошибок из разных столбцов в сгруппированную гистограмму с помощью ggplot2

Я хотел бы добавить планки погрешностей к моей гистограмме. Данные для стандартных отклонений находятся в двух разных столбцах.

Это мой барплот:

# load packages
> library(data.table)
> library(ggplot2)
> library(tidyr)
> 
> results <- fread("Results.csv", header=TRUE, sep = ";")
> 
> str(results)
Classes ‘data.table’ and 'data.frame':  7 obs. of  5 variables:
 $ Organism   : chr  "AC1432" "D3425" "BF3523" "XR2405" ...
 $ Molecule1  : num  39.5 418.4 189.2 49.3 4610.9 ...
 $ Molecule1sd: num  19.6 70.9 102.8 21.2 275.9 ...
 $ Molecule2  : num  276 6511 235 500 11205 ...
 $ Molecule2sd: num  21 291.1 109.7 67.1 94.5 ...
 - attr(*, ".internal.selfref")=<externalptr> 
> 
> df <- data.frame(results)
> 
> str(df)
'data.frame':   7 obs. of  5 variables:
 $ Organism   : chr  "AC1432" "D3425" "BF3523" "XR2405" ...
 $ Molecule1  : num  39.5 418.4 189.2 49.3 4610.9 ...
 $ Molecule1sd: num  19.6 70.9 102.8 21.2 275.9 ...
 $ Molecule2  : num  276 6511 235 500 11205 ...
 $ Molecule2sd: num  21 291.1 109.7 67.1 94.5 ...
> 
> 
> 
> # Manually set factor levels of 'Organism' column to plot in a logical order.
> df$Organism = factor(df$Organism, 
+                      levels=c("without organism", "AC1432", "BF3523", "XR2405", "D3425", "XR2463", "ATF259"))
> 
> df.g <- gather(df, Molecule1, Molecule2, -Organism, -Molecule1sd, -Molecule2sd)
> df.sd <- gather(df, Molecule1sd, Molecule2sd, -Molecule1, -Molecule2, -Organism)
> ggplot(df.g, aes(Molecule1, Molecule2)) + 
+     geom_bar(aes(fill = Organism), stat = "identity", position = "dodge")

гистограмма без полосы ошибок

используемые данные:

> dput(df)
structure(list(Organism = structure(c(2L, 5L, 3L, 4L, 6L, 7L, 
1L), .Label = c("without organism", "AC1432", "BF3523", "XR2405", 
"D3425", "XR2463", "ATF259"), class = "factor"), Molecule1 = c(39.45920899, 
418.4234805, 189.162295, 49.314698, 4610.921188, 751.7070352, 
35), Molecule1sd = c(19.55450482, 70.91013667, 102.7566193, 21.20841393, 
275.8934527, 71.62450643, NA), Molecule2 = c(275.9147606, 6510.974605, 
235.247381, 499.8928585, 11205.33907, 9507.869294, 250), Molecule2sd = c(21.04668977, 
291.1223384, 109.652064, 67.1000078, 94.54544271, 707.1950335, 
NA)), row.names = c(NA, -7L), class = "data.frame")

и это моя проба для баров ошибок

ggplot(df.g, aes(Molecule1, Molecule2)) + 
  geom_bar(aes(fill = Organism), stat = "identity", position = "dodge") +geom_errorbar(df.sd, aes_Molecule1(ymin=Molecule1-Molecule1sd, ymax=Molecule1+Molecule1sd),aes_Molecule2(ymin=Molecule2-Molecule2sd, ymax=Molecule2+Molecule2sd), width=.2 )

но моя идея не работает. Как добавить планки погрешностей из двух разных столбцов?

Можете ли вы опубликовать образец ваших данных с возможностью копирования и вставки с помощью dput?

A. S. K. 13.12.2020 21:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Пакет и набор данных

library(tidyverse)  

df <- data.frame(Organism = c("AC1432", "D3425", "BF3523", "XR2405",  
                              "XR2463", "ATF259", "without organism"),
                 Molecule1 = c(39.5, 418.4, 189.2, 49.3, 
                               4610.9, 800, 10),
                 Molecule1sd = c(19.6, 70.9, 102.8, 21.2, 
                                 275.9, 100, 1),
                 Molecule2 = c(276, 6511, 235, 500, 
                               11205, 9500, 250),
                 Molecule2sd = c( 21, 291.1, 109.7, 67.1,
                                  94.5, 50, 2))

# I estimated the not shown values in your str(result)

Изменение формы

df2 <- df %>%
  # add meaningful ending to columnnames containing mean (m)
  select(Molecule1m = Molecule1, 
         Molecule2m = Molecule2,
         everything()) %>%
  # gather whole dataset into Molecule, mean, sd
  pivot_longer(cols = -Organism,
               names_to = c("Molecule", ".value"),
               names_pattern = "(Molecule[12])(.)") %>%
  # factor reorder levels
  mutate(Organism = factor(Organism,
                           levels=c("without organism", "AC1432", 
                                    "BF3523", "XR2405", 
                                    "D3425", "XR2463", "ATF259")))

Сюжет

ggplot(df2, aes(x = Molecule,
                y = m,
                fill = Organism)) +
  geom_col(position = "dodge") +
  geom_errorbar(aes(ymin = m - s, ymax = m + s),
                position = "dodge")

Другие вопросы по теме