How can I plot a line for time series data with categorical intervals in R

I am working with single time-series measurements that I want to plot for the time window of about 1 week.

This is the data I am working with.

This is my R script:

library(tidyverse)
library(ggplot2)

filesource - C:/ ... /testData.csv
df -read.csv(filesource, header = TRUE)

ggplot() +
  geom_line(data = df, aes(x = date, y = value, group = 1), color = red) +
  ggtitle(Some Measure over Time) +
  xlab(Time) +
  ylab(Some Measure in %)

This produces this plot.

What I want is to have the individual unique weekdays show on the x-axis like this, as if I would plot the days as individual categories but only show the first one of each day. I cannot really hardcode this, because I am working with different participants, days and value amounts per day.

Expected Outcome:

So I created a new variable with the weekdays:

df$day - weekdays(as.Date(df$date, '%d-%m-%Y'))

However, when I want to use this column as the x-axis variable, The days are not in the right order, and all values of one day obviously get plotted on top of each day:

geom_line(data = df, aes(x = day, y = value, group = 1), color = red)

I have seen this being somewhat solved in python: Visualizing Time Series Data

However, I really want to use R and Markdown to create automated participant reports. If this is easier to accomplish with another plotting function in R, I am open ears. I just like the customizability of ggplot.

I hope my example is clear. I guess this can be solved with the right ggplot() parameters and settings. Does anyone have a solution for ending up with something more like the expected outcome montage?

Topic plotting ggplot2 time-series r

Category Data Science


Would something like this work? I simply add an extra column that indicates the row number (which is later used as the x-axis) to make sure all values are displayed as a new point instead of plotting on top of each other for the same day. I then specifiy the custom x ticks and labels by selecting the first row for each day and get the row number (which specifies where the ticks and labels have to be drawn) and the day name (which specifies what the labels should display).

library(readr)
library(ggplot2)

df <- read_csv("testData.csv") %>%
  mutate(
    date = as.Date(date, "%d-%m-%Y"),
    day = weekdays(date),
    row = row_number()
)
ticks <- df %>% group_by(day) %>% filter(row_number() == 1) %>% select(row)

ggplot() +
  geom_line(data = df, aes(x = row, y = value, group = 1), color = "red") +
  ggtitle("Some Measure over Time") +
  xlab("Time") +
  ylab("Some Measure in %") + 
  scale_x_continuous(breaks=pull(ticks, row), labels=pull(ticks, day))

enter image description here

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.