Как построить штрих-код фрейма данных из 3 столбцов с помощью geom_bar? - PullRequest
0 голосов
/ 18 июня 2020

Мой фрейм данных выглядит так:

`cycle1 ( 14 teachers)` `cycle2 ( 16 teachers)` `cycle3 ( 11 teachers)`

1              7.14                    18.8                    27.3
2              14.3                     25                      27.3
3              21.4                     25                      18.2
4              14.3                     31.2                    36.4
5              21.4                     18.8                    45.5

, и я хотел бы создать гистограмму, которая выглядит так: гистограмма

Мне это удалось с функцией barplot (), но мне нужно добавить доверительные интервалы, поэтому я пытаюсь сделать это с помощью ggplot. Проблема исходит из организации моих данных, но я не знаю, как ее решить.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете использовать следующий код

library(tidyverse)
library(viridis)


df %>% 
  pivot_longer(cols = -id) %>% 
  ggplot(aes(x = name, y=value, fill = factor(id))) + 
  geom_col(position = position_dodge()) + 
  scale_fill_viridis(discrete = T, name = "Title") + theme_bw() + 
  scale_y_continuous(limits = c(0, max(df)+1),
                     expand = c(0, 0)) + 
  labs(x="", y="Proportion (%)") +
  theme(text = element_text(family = "serif", color = "black", size = 15))+ 
  theme(axis.text = element_text(family = "serif", color = "black", size = 12))

введите описание изображения здесь

Данные

df = structure(list(id = 1:5, `cycle1 (14 teachers)` = c(7.14, 14.3, 
21.4, 14.3, 21.4), `cycle2 (16 teachers)` = c(18.8, 25, 25, 31.2, 
18.8), `cycle3 (11 teachers)` = c(27.3, 27.3, 18.2, 36.4, 45.5
)), class = "data.frame", row.names = c(NA, -5L))
0 голосов
/ 18 июня 2020

ggplot принимает в качестве входных данных длинный формат. Вы можете использовать melt(), чтобы преобразовать ваши данные в правильный длинный формат. Для получения информации о том, как использовать расплав, вы можете использовать ?melt.

Это приведет к таблице из 3 столбцов, в первом столбце будет переменная (ваши разные циклы), а во втором - значения. Используя данные вашего примера (упрощая имена столбцов), это приведет к следующему коду.

df = data.frame(id = as.character(1:5),
                cycle1 = c(7.14, 14.3, 21.4, 14.3, 21.4), 
                cycle2 = c(18.8, 25, 25, 31.2, 18.8), 
                cycle3 = c(27.3, 27.3, 18.2, 36.4, 45.5))

library(reshape2)
library(viridis)

df_melt = melt(df, id.vars=  "id")

ggplot(df_melt, aes(x = variable, y = value, fill = id)) +
  geom_col(position = position_dodge()) +
  scale_fill_viridis_d()

...