Накопление гистограммы из нескольких столбцов в R - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть следующие данные

ID | Category (1-5) | Task1(in min) | Task2(in min) | Task3(in min)

Я хотел бы создать гистограмму с различными категориями на оси x и суммарной продолжительностью задач 1, 2, 3 (соответственно выделенных цветом) наось Y.

Возможно ли это в R без необходимости изменять исходные данные?Кажется, что ggplot занимает только один столбец, но не несколько.

Редактировать: Моя (довольно неудачная) попытка была

library(ggplot2)
ggplot(dataset) + geom_col(aes(x=Category, y=Task1, fill=Task2))

Я не мог заставить себя расставить несколько столбцов в заливке.

Вот данные образца данных

dataset <- structure(list(ID = c(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25), Category = c("5 - Expert", "2 - Novice", "3 - Intermediate", "5 - Expert", "2 - Novice", "3 - Intermediate", "3 - Intermediate", "3 - Intermediate", "2 - Novice", "3 - Intermediate", "2 - Novice", "4 - Advanced", "2 - Novice", "3 - Intermediate", "2 - Novice", "5 - Expert", "4 - Advanced", "2 - Novice", "2 - Novice", "3 - Intermediate"), Task1 = structure(c(300, 360, 240, 180, 180, 240, 240, 360, 300, 300, 180, 360, 240, 240, 240, 300, 240, 240, 240, 240), class = c("hms", "difftime"), units = "secs"), Task2 = structure(c(480, 360, 660, 420, 660, 240, 660, 540, 780, 360, 540, 720, 360, 480, 540, 300, 420, 600, 240, 660), class = c("hms", "difftime"), units = "secs"), Task3 = structure(c(360, 480, 240, 300, 240, 240, 240, 240, 240, 180, 240, 180, 120, 120, 240, 240, 240, 240, 300, 240), class = c("hms", "difftime"), units = "secs")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Не думаю, что вам нужна гистограмма.Гистограммы - это частотные распределения, которые имеют отсчеты по оси Y и некоторую непрерывную переменную по оси X.Таким образом, вы на самом деле строите только одну переменную.

Чтобы получить категорию по оси X и совокупное время по оси Y, вы хотите использовать geom_bar().Поскольку каждая категория - это отдельная полоса на оси X, вам не нужно отдельно их окрашивать, но я сделал это, используя аргумент fill=Category в оболочке aes() в функции ggplot(), просто для иллюстрации.

Пример кадра данных:

df <- data.frame(Category = c("Cat1", "Cat2", "Cat3", "Cat4", "Cat5"),
                 Task1 = rnorm(5,7,0.5),
                 Task2 = rnorm(5,8,0.5),
                 Task3 = rnorm(5,9,0.5))

Пример решения:

df %>%
  mutate(TaskTime = Task1 + Task2 + Task3) %>% # Creating cumulative time
  ggplot(aes(x = Category, y = TaskTime, fill = Category))+ # Passing plot arguments
  geom_bar(stat="Identity") # Specifying the type of plot
0 голосов
/ 18 декабря 2018

Вы были очень близки.Сделайте ваши данные длинными.Здесь решение с использованием ggplot.

library(tidyverse)
dataset <- structure(list(ID = c(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25), Category = c("5 - Expert", "2 - Novice", "3 - Intermediate", "5 - Expert", "2 - Novice", "3 - Intermediate", "3 - Intermediate", "3 - Intermediate", "2 - Novice", "3 - Intermediate", "2 - Novice", "4 - Advanced", "2 - Novice", "3 - Intermediate", "2 - Novice", "5 - Expert", "4 - Advanced", "2 - Novice", "2 - Novice", "3 - Intermediate"), Task1 = structure(c(300, 360, 240, 180, 180, 240, 240, 360, 300, 300, 180, 360, 240, 240, 240, 300, 240, 240, 240, 240), class = c("hms", "difftime"), units = "secs"), Task2 = structure(c(480, 360, 660, 420, 660, 240, 660, 540, 780, 360, 540, 720, 360, 480, 540, 300, 420, 600, 240, 660), class = c("hms", "difftime"), units = "secs"), Task3 = structure(c(360, 480, 240, 300, 240, 240, 240, 240, 240, 180, 240, 180, 120, 120, 240, 240, 240, 240, 300, 240), class = c("hms", "difftime"), units = "secs")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

dataset_long <- dataset %>% gather(task, value, Task1:Task3)

ggplot(dataset_long) + geom_col(aes(x = Category, y = value, fill = task))

Создано в 2018-12-18 пакетом Представить (v0.2.1)

Я надеюсь, что это близко к желаемому результату.Это не требует изменения ваших необработанных данных, но работа с R требует некоторой гибкости для формирования ваших данных.Я предполагаю, что приведение ваших данных в правильную форму / форму составляет около 95% работы, необходимой для ваших задач анализа / визуализации в R.

0 голосов
/ 17 декабря 2018
df %>% mutate(task_composite = Task1 + Task3 + Task 4) %>% ggplot(aes(task_composite) + 
geom_histogram()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...