简体   繁体   中英

How to plot a line connecting geom_points for repeated measures in R?

I'm looking for a way to connect my individual datapoints in my ggplot, so show that the data is a repeated measure of the same individual over time. Until now, I've managed to create a barplot with the individual geom_point (datapoint per subject) on top. I would however like to connect the dots matching to the same participant between the three timepoints. Any pointers?

  ## Example data, data from two groups: patients and controls
    data_ex <- data.frame( pnum = c(1,2,3,4,5,6,7,8,9,10),
                               group = c("patient", "patient","patient","patient","patient","control","control","control", "control", "control"),
                               age = c(24,35,43,34,55,24,36,43,34,54),
                               panas_1.1 = c(-26, -15, -17, -15, -20, -21, -18, -19, -16, -20),
                               panas_1.2 = c(-25, -19, -14, -18, -20, -22, -17, -19, -18, -19),
                               panas_1.3 = c(-22, -21, -18, -14, -21, -21, -14, -17, -16, -18))

    ## Reshape the data
        data_ex_long <- data_ex %>% gather(key = time, value = PANAS_score, panas_1.1, panas_1.2, panas_1.3)

    ## plot the data
        ggplot(data=data_ex_long,aes(x = time, y = PANAS_score, fill = group)) +  
            geom_bar(stat = "summary",fun.y = 'mean', colour="black", size=1.8, position = position_dodge(width = 1)) +
          geom_point(aes(time, fill = group), colour="black", size = 3, shape = 21, position = 
                       position_jitterdodge(jitter.width = 0.2, jitter.height=0.4, 
                                            dodge.width=0.9), alpha = 0.8) +
          geom_errorbar(aes(size=2),stat = 'summary', position = 'dodge', color = "black", width = 1, size = 1, fatten = 2) +
          theme(text = element_text(size = 18),
                legend.position = "none",
                axis.text.x  = element_text(size=15, color="#000000"),     
                axis.text.y  = element_text(size=20, color="#000000"),       
                axis.title.x = element_blank(),  
                axis.title.y = element_text(size=18, color="#000000"),
                axis.line.x  = element_line(colour = "black", size = 1.3), 
                axis.line.y  = element_line(colour = "black", size = 1.3),
                panel.border = element_blank(),
                panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
                panel.grid.minor.x = element_blank(), panel.grid.major.x = element_blank(),
                panel.background = element_blank(),
                axis.ticks.length = unit(.25, "cm"),
                axis.line = element_line()) +
          ylab(" PANAS score ") + 
          NULL

在此处输入图片说明

You can try

pd <- position_dodge(0.8)
ggplot(data=data_ex_long,aes(x = time, y = PANAS_score, fill = factor(group, levels = c("patient", "control")))) +  
  geom_bar(stat = "summary",fun.y = 'mean', color=1, position = "dodge") +
  geom_point(aes(group=pnum),position = pd, shape =21) +
  geom_line(aes(group=pnum),position = pd) + 
  geom_errorbar(stat = 'summary', position = "dodge") +
  scale_fill_discrete("")

在此处输入图片说明

According to your comment I recommend to switch completely to stat_summary

pd <- position_dodge(.9)

data_ex_long$group <- factor(data_ex_long$group, levels = c("patient", "control"))
ggplot(data=data_ex_long,aes(x = time, y = PANAS_score, fill = group)) +  
  stat_summary(fun.y = "mean", geom = "bar",position = pd) + 
  stat_summary(aes(group = group), 
               fun.y = "mean", geom = "line",position = pd, size= 1.5 ) + 
  stat_summary(fun.data = mean_se, geom = "errorbar",position = pd, width = 0.3) + 
  geom_point(aes(group=pnum),position = pd, shape =21)

在此处输入图片说明

Used ggplot2_3.1.0

I'm trying to do a similar plot but struggling! I have two repeated measures factors rather than a repeated measures and independent groups. So on my x-axis I have a before and after drug measure, with two boxplots for before (where colour is different for resting vs action) and two boxplot for after (resting vs action in different colours). I want to be able to show the trend per subject, where there is a data point for each of the 4 four plots.

The below gives me box plots with jitter-ed points per box plot, but I want a line connecting the points for individual subjects.

p <- ggplot(df, aes(x=Group, y=PLV, fill=Move)) +
  geom_boxplot(outlier.size = -1) +
  geom_point(df,mapping=aes(x=Group, y=PLV, fill=Move), position = position_jitterdodge  0.2)

df:

1   Before  Rest    0.22238
2   Before  Rest    0.21670
3   Before  Rest    0.21443
4   Before  Rest    0.22624
5   Before  Move    0.22796
6   Before  Move    0.22217
7   Before  Move    0.21418
8   Before  Move    0.21679
9   After   Rest    0.36057
10  After   Rest    0.26613
11  After   Rest    0.27747
12  After   Rest    0.32213
13  After   Move    0.35226
14  After   Move    0.27122
15  After   Move    0.26650
16  After   Move    0.28785

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM