ggplot2: подсчитывает линейную диаграмму преценденции для групп факторов в наборе данных серии дат

#r #ggplot2 #time-series

#r #ggplot2 #временные ряды

Вопрос:

Мои данные представляют собой запись результатов исследования. Она содержит две группы (group1 и group2), три результата (положительный, нейтральный и отрицательный). Кроме того, это набор данных временных рядов, поэтому он имеет переменную даты (day1, day2, …)

Вот пример моих данных:

 Book1 %>% head(n=20)
# A tibble: 20 x 4
      No Group Result   date 
   <dbl> <dbl> <chr>    <chr>
 1     1     1 positive day1 
 2     2     1 neutral  day1 
 3     3     1 neutral  day1 
 4     4     2 negative day1 
 5     5     2 positive day1 
 6     6     2 neutral  day1 
 7     7     1 neutral  day1 
 8     8     1 negative day1 
 9     9     1 positive day1 
10    10     2 neutral  day1 
11    11     1 neutral  day2 
12    12     1 negative day2 
13    13     1 positive day2 
14    14     2 neutral  day2 
15    15     2 neutral  day2 
16    16     2 negative day2 
17    17     1 positive day2 
18    18     1 positive day2 
19    19     1 positive day2 
20    20     2 positive day2 
  

Я планирую нарисовать линейную диаграмму для сравнения скорости результата (положительной скорости, нейтральной скорости и отрицательной скорости) между двумя группами, поэтому мой код:

 Book1 %>%
  ggplot(aes(x = Date, y = (..count..)/sum(..count..), fill = Group))  
  geom_line(stat = "count")  
  facet_grid(Result~.)
  

Тем не менее, я получаю много предупреждающей информации:

 geom_path: Each group consists of only one
observation. Do you need to adjust the group
aesthetic?
  

и график ничего не содержит. вот график:

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

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

Комментарии:

1. Имя столбца не совпадает, т.Е. Оно должно быть date вместо Date

2. Когда вы выполняете суммирование, для каждой группы будет одно значение. Вам нужно geom_col вместо geom_line

Ответ №1:

geom_line ожидается более одного наблюдения. После суммирования в каждой группе будет один элемент. Вместо geom_line , geom_col или geom_bar было бы полезно

 library(dplyr)
library(ggplot2)
Book1 %>% 
     group_by(date, Group = factor(Group), Result) %>%
     summarise(value = n(), .groups = 'drop') %>% 
     mutate(perc = value/sum(value)) %>% 
     ggplot(aes(x = date, y = perc, fill = Group))   
            geom_col()  
            facet_grid(~ Result)
  

-вывод

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


Или, если мы используем ..count..

 Book1 %>% 
     mutate(Group = factor(Group)) %>%
     ggplot(aes(x = date))   
        geom_bar(aes(y = (..count..)/sum(..count..), fill = Group))  
        facet_grid(~ Result)
  

-вывод

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

данные

 Book1 <- structure(list(No = 1:20, Group = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L), Result = c("positive", 
"neutral", "neutral", "negative", "positive", "neutral", "neutral", 
"negative", "positive", "neutral", "neutral", "negative", "positive", 
"neutral", "neutral", "negative", "positive", "positive", "positive", 
"positive"), date = c("day1", "day1", "day1", "day1", "day1", 
"day1", "day1", "day1", "day1", "day1", "day2", "day2", "day2", 
"day2", "day2", "day2", "day2", "day2", "day2", "day2")),
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
  

Ответ №2:

Линейный график возможен и зависит от того, как вы набрасываете сводки для своих данных. Вы можете увидеть эволюцию по дням для каждой группы, используя код этого стиля:

 library(ggplot2)
library(dplyr)
#Code
df %>% group_by(Group,Result,date) %>%
  summarise(N=n()) %>%
  ggplot(aes(x=date,y=N,group=Result,color=Result)) 
  geom_line(size=1) 
  geom_point(size=1) 
  scale_y_continuous(limits = c(0,NA)) 
  facet_grid(.~Group) 
  theme_bw() 
  theme(axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        strip.text = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'))
  

Вывод:

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

Это действительно интересный подход, использующий линии, чтобы увидеть, как меняются тенденции в результатах.

Некоторые используемые данные:

 #Data
df <- structure(list(No = 1:20, Group = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L), Result = c("positive", 
"neutral", "neutral", "negative", "positive", "neutral", "neutral", 
"negative", "positive", "neutral", "neutral", "negative", "positive", 
"neutral", "neutral", "negative", "positive", "positive", "positive", 
"positive"), date = c("day1", "day1", "day1", "day1", "day1", 
"day1", "day1", "day1", "day1", "day1", "day2", "day2", "day2", 
"day2", "day2", "day2", "day2", "day2", "day2", "day2")), class = "data.frame", row.names = c(NA, 
-20L))
  

Или, используя проценты, вы можете попробовать:

 #Code 2
df %>% group_by(Group,Result,date) %>%
  summarise(N=n()) %>% ungroup() %>%
  group_by(Group) %>% mutate(Perc=N/n()) %>%
  ggplot(aes(x=date,y=Perc,group=Result,color=Result)) 
  geom_line(size=1) 
  geom_point(size=1) 
  scale_y_continuous(limits = c(0,NA),labels = scales::percent) 
  facet_grid(.~Group) 
  theme_bw() 
  theme(axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        strip.text = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'))
  

Вывод:

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

Комментарии:

1. Спасибо, Дак. Ваш ответ настолько потрясающий!!

2. @Carlos Отлично! Надеюсь, это помогло вам!! Это был хороший вопрос для размышлений!