Построение графиков с течением времени с использованием нескольких категорий

#r #ggplot2 #dplyr

#r #ggplot2 #dplyr

Вопрос:

Прошу прощения за заголовок, я не был уверен, как спросить об этом. У меня есть фрейм данных, который выглядит следующим образом.

 Sample=c("A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B")
Treatment=c("twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook",
            "twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook")
replicate=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
time=c( 10,10,10,10,10,10,10,10,10,10,10,10,20,20,20,20,20,20,20,20,20,20,20,20)
points=c(20,40,80,20,60,120, 30,100,55, 28, 45,90, 80,20,100, 40,90,56,20,30,12,3,5,8)
length(points)

   Sample Treatment replicate time points
1       A    twiter         1   10     20
2       A    twiter         2   10     40
3       A    twiter         3   10     80
4       B    twiter         1   10     20
5       B    twiter         2   10     60
6       B    twiter         3   10    120
7       A  facebook         1   10     30
8       A  facebook         2   10    100
9       A  facebook         3   10     55
10      B  facebook         1   10     28
11      B  facebook         2   10     45
12      B  facebook         3   10     90
13      A    twiter         1   20     80
14      A    twiter         2   20     20
15      A    twiter         3   20    100
16      B    twiter         1   20     40
17      B    twiter         2   20     90
18      B    twiter         3   20     56
19      A  facebook         1   20     20
20      A  facebook         2   20     30
21      A  facebook         3   20     12
22      B  facebook         1   20      3
23      B  facebook         2   20      5
24      B  facebook         3   20      8

 

Я хотел бы отображать свои данные с использованием графиков в каждый момент времени.
Я хотел бы иметь один график, который показывает образец A с помощью «twiter», Образец A с помощью «facebook»
Образец «B» с «twiter» и образец B с «facebook» в момент времени 10 и то же самое в момент времени 20.

Пока я могу сделать что-то вроде этого. введите описание изображения здесь

 ggplot(data,aes(x=time, y=points,color=Sample, fill=Sample, group=interaction(Sample,Treatment)), alpha=0.1)  
  geom_boxplot(alpha=0.1)  
  geom_point(position = position_dodge(width=0.75), alpha=0.2) 
  theme_bw() 

 

Но это неправильно, я хотел бы иметь образцы A и B из двух разных обработок рядом друг с другом в каждый момент времени, чтобы взглянуть на различия. Я не хочу использовать facet_wrap. Для меня это вызов. Спасибо за ваше время

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

1. Вы group = interaction(Sample,Treatment) time также переопределяете группировку по. Вы можете получить то, что вы описываете, изменив на group = interaction(Sample,Treatment, time) , но это не дает вам возможности отличить, какой блок идет с какой обработкой — возможно, метки также в порядке.

2. Спасибо, приятель, это было круто. Мне потребовалось некоторое время. Спасибо, что посмотрели на это

Ответ №1:

Превращение моего комментария в ответ: ваша проблема заключается в том, что group=interaction(Sample,Treatment) переопределяет группировку по оси x (времени), которая обычно выполняется. Чтобы включить time в группировку, добавьте ее в interaction :

 ggplot(data,
       aes(
         x = time,
         y = points,
         color = Sample,
         fill = Sample,
         group = interaction(Sample, Treatment, time)
       ),
       alpha = 0.1)  
  geom_boxplot(alpha = 0.1)  
  geom_point(position = position_dodge(width = 0.75), alpha = 0.2)  
  theme_bw()
 

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

Конечно, остается проблема в том, что нет способа определить, какой блок идет с какой обработкой, но я оставлю это на ваше усмотрение.

Ответ №2:

Попробуйте это:

 library(dplyr)
library(ggplot2)
#Plot
data %>%
  arrange(Sample) %>%
  mutate(Var=paste(Sample,Treatment),
         Var=factor(Var,levels = unique(Var),ordered = T)) %>%
  ggplot(aes(x=time,
             y=points,
             color=Var, fill=Var,
             group=Var), alpha=0.1)  
  geom_boxplot(alpha=0.1) 
  geom_point(position = position_dodge(width=0.75), alpha=0.2) 
  theme_bw() 
  scale_color_manual(values=c('tomato','tomato','cyan3','cyan3')) 
  scale_fill_manual(values=c('tomato','tomato','cyan3','cyan3'))
 

Вывод:

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

Ответ №3:

Если вы не возражаете против того, чтобы время играло важную роль, вы можете сделать следующее. Обратите внимание, что я превратил ваши данные во фрейм данных с именем ‘dat’.

 dat <- data.frame(Sample=c("A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B"),
Treatment=c("twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook",
            "twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook"),
replicate=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
time=c( 10,10,10,10,10,10,10,10,10,10,10,10,20,20,20,20,20,20,20,20,20,20,20,20),
points=c(20,40,80,20,60,120, 30,100,55, 28, 45,90, 80,20,100, 40,90,56,20,30,12,3,5,8))

dat %>%
  mutate(time = factor(time)) %>%
  ggplot(aes(x=time, y=points, color=Sample, fill=Sample), alpha=0.1)  
  geom_boxplot(alpha=0.1)  
  geom_point(position = position_dodge(width=0.75), alpha=0.2) 
  theme_bw() 
 

коробочный график по времени