rggplot2linetidyrsegment

How to connect points according to grouping instead of connecting all points in ggplot?


As the title stated, I want to connect points in every group instead of all points.

Here is the original date:

df<-structure(list(TN = c(13.6, 18, 18.5, 17, 16.9, 13.6, 17.6, 14.8, 
                          14, 11, 12.6, 18.6, 18.8, 18.3, 19.4, 18.5, 18.9, 22, 22.3), 
                   TX = c(29.9, 26.9, 30.5, 26.6, 25.4, 29.7, 24.1, 21.1, 23.8, 
                          29.3, 34.4, 31.1, 32, 35.9, 36.7, 37.5, 39.2, 34.8, 33.6), 
                   TM = c(22.5, 21.4, 23.3, 21.4, 20.2, 21.4, 19.9, 17.8, 18.9, 
                          20.9, 24.5, 24.5, 25.1, 27.3, 28.2, 28.5, 29.2, 28.2, 26.8
                   ), Date = c("01/06/2022", "02/06/2022", "03/06/2022", "04/06/2022", 
                               "05/06/2022", "06/06/2022", "07/06/2022", "08/06/2022", "09/06/2022", 
                               "10/06/2022", "11/06/2022", "12/06/2022", "13/06/2022", "14/06/2022", 
                               "15/06/2022", "16/06/2022", "17/06/2022", "18/06/2022", "19/06/2022"
                   )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                               -19L))

Here is my code:

library(ggplot2)
library(tidyr)
library(dplyr)

df %>% select(Date, TN, TX) %>%
  pivot_longer(cols = c(TN,TX), names_to = "Tcombine", values_to = "Value") %>%
  ggplot(aes(Date, Value,group = 1,shape=Tcombine,color=Tcombine)) +
  geom_point()+
  geom_line()+
  theme(axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())

I want the points of the two groups (two colors) to be connected separately as the date changes, but I don't know why all the points are connected? enter image description here

Here is final graph I got: enter image description here Any suggestions are welcome! Thank you in adavance!


Solution

  • Add group=Tcombine.

    df %>% select(Date, TN, TX) %>%
      pivot_longer(cols = c(TN,TX), names_to = "Tcombine", values_to = "Value") %>%
      ggplot(aes(Date, Value,group = 1,shape=Tcombine,color=Tcombine)) +
      geom_point()+
      geom_line(aes(group = Tcombine))+
      theme(axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())
    

    enter image description here

    Incidentally, while the ordering of your x-axis works here, the moment you get another month it will break. I suggest you convert your Date column to a proper Date-class and add scale_x_date.

    df %>% 
      mutate(Date = as.Date(Date, format = "%d/%m/%Y")) %>%
      select(Date, TN, TX) %>%
      pivot_longer(cols = c(TN,TX), names_to = "Tcombine", values_to = "Value") %>%
      ggplot(aes(Date, Value,group = 1,shape=Tcombine,color=Tcombine)) +
      geom_point()+
      geom_line(aes(group = Tcombine)) +
      scale_x_date(date_breaks = "1 day") +
      theme(axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())
    

    ggplot2 with dates corrected

    While this looks very similar, you have much better control over breaks (e.g., date_breaks = "3 days") and formatting (e.g., date_labels ="%d/%m/%Y" if you really want that formatting of the dates).