Home > Blockchain >  Plotting multiple columns, grouping by date, and adjusting scale
Plotting multiple columns, grouping by date, and adjusting scale

Time:06-10

So here I what I want, I want to plot 4 columns (Standing, Sitting, Stepping, Cycling) vs Time, and have 1 plot per date. I also want the Y scale to be scaled between 0.5 and 4.5, BUT the Y axis be invisible and a legend saying which color is which.

Here is a sample of my data:

> head(graph_pre,30)
         Date                Time Axis1 Axis2 Axis3     VM Standing Stepping Cycling New_Sitting Counter
1  2022-05-10 2022-05-10 09:01:00    21    40     2  45.22        0        0       2           0       0
2  2022-05-10 2022-05-10 09:01:01     0    36     1  36.01        0        0       0           1       1
3  2022-05-10 2022-05-10 09:01:02    24     1     0  24.02        0        0       0           1       0
4  2022-05-10 2022-05-10 09:01:03    48    31     4  57.28        0        0       2           0       1
5  2022-05-10 2022-05-10 09:01:04     0     6     0   6.00        0        0       0           1       1
6  2022-05-10 2022-05-10 09:01:05     0     0     0   0.00        0        0       0           1       0
7  2022-05-10 2022-05-10 09:01:06     0     0     0   0.00        0        0       0           1       0
8  2022-05-10 2022-05-10 09:01:07     0     0     0   0.00        0        0       0           1       0
9  2022-05-10 2022-05-10 09:01:08     0     5     2   5.39        0        0       0           1       0
10 2022-05-10 2022-05-10 09:01:09    20    33     3  38.70        0        0       0           1       0
11 2022-05-10 2022-05-10 09:01:10    14    26    29  41.39        0        0       2           0       1
12 2022-05-10 2022-05-10 09:01:11    11     0     4  11.70        0        0       0           1       1
13 2022-05-10 2022-05-10 09:01:12     0     0     0   0.00        0        0       0           1       0
14 2022-05-10 2022-05-10 09:01:13     0     0     0   0.00        0        0       0           1       0
15 2022-05-10 2022-05-10 09:01:14    82   126   113 188.07        0        3       0           0       1
16 2022-05-10 2022-05-10 09:01:15    60    64    47  99.52        0        0       2           0       1
17 2022-05-10 2022-05-10 09:01:16    98   140   236 291.38        0        0       2           0       0
18 2022-05-10 2022-05-10 09:01:17   151   118   221 292.52        0        0       2           0       0
19 2022-05-10 2022-05-10 09:01:18    44    13    99 109.11        0        0       2           0       0
20 2022-05-10 2022-05-10 09:01:19     6     6    53  53.67        0        0       2           0       0
21 2022-05-10 2022-05-10 09:01:20    39     8    65  76.22        0        0       2           0       0
22 2022-05-10 2022-05-10 09:01:21    17    20    57  62.75        0        0       2           0       0
23 2022-05-10 2022-05-10 09:01:22    51    46   269 277.63        0        0       2           0       0
24 2022-05-10 2022-05-10 09:01:23    15    45    82  94.73        0        3       0           0       1
25 2022-05-10 2022-05-10 09:01:24    22    34     4  40.69        0        0       2           0       1
26 2022-05-10 2022-05-10 09:01:25   114    93    41 152.73        0        0       2           0       0
27 2022-05-10 2022-05-10 09:01:26    74    67    92 135.75        0        0       2           0       0
28 2022-05-10 2022-05-10 09:01:27   117     9    40 123.98        0        0       2           0       0
29 2022-05-10 2022-05-10 09:01:28    33    15     0  36.25        0        0       0           1       1
30 2022-05-10 2022-05-10 09:01:29     0     0     0   0.00        0        0       0           1       0

I have the code to separate by date, and to "kinda" plot, but I need it for the 4 columns.

graph_pre <-  mutate(graph_pre, day = lubridate::day(Date))
ggplot(graph_pre, aes(x = Time, y = Posture)) 
  geom_point() 
  facet_wrap(~day, scales = "free_x")
 dput(head(graph_pre,30))
structure(list(Date = structure(c(19122, 19122, 19122, 19122, 
19122, 19122, 19122, 19122, 19122, 19122, 19122, 19122, 19122, 
19122, 19122, 19122, 19122, 19122, 19122, 19122, 19122, 19122, 
19122, 19122, 19122, 19122, 19122, 19122, 19122, 19122), class = "Date"), 
    Time = structure(c(1652187660, 1652187661, 1652187662, 1652187663, 
    1652187664, 1652187665, 1652187666, 1652187667, 1652187668, 
    1652187669, 1652187670, 1652187671, 1652187672, 1652187673, 
    1652187674, 1652187675, 1652187676, 1652187677, 1652187678, 
    1652187679, 1652187680, 1652187681, 1652187682, 1652187683, 
    1652187684, 1652187685, 1652187686, 1652187687, 1652187688, 
    1652187689), class = c("POSIXct", "POSIXt"), tzone = ""), 
    Axis1 = c(21, 0, 24, 48, 0, 0, 0, 0, 0, 20, 14, 11, 0, 0, 
    82, 60, 98, 151, 44, 6, 39, 17, 51, 15, 22, 114, 74, 117, 
    33, 0), Axis2 = c(40, 36, 1, 31, 6, 0, 0, 0, 5, 33, 26, 0, 
    0, 0, 126, 64, 140, 118, 13, 6, 8, 20, 46, 45, 34, 93, 67, 
    9, 15, 0), Axis3 = c(2, 1, 0, 4, 0, 0, 0, 0, 2, 3, 29, 4, 
    0, 0, 113, 47, 236, 221, 99, 53, 65, 57, 269, 82, 4, 41, 
    92, 40, 0, 0), VM = c(45.22, 36.01, 24.02, 57.28, 6, 0, 0, 
    0, 5.39, 38.7, 41.39, 11.7, 0, 0, 188.07, 99.52, 291.38, 
    292.52, 109.11, 53.67, 76.22, 62.75, 277.63, 94.73, 40.69, 
    152.73, 135.75, 123.98, 36.25, 0), Standing = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0), Stepping = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 
    0, 0, 0, 0), Cycling = c(2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 
    0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0), 
    New_Sitting = c(0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1), Counter = c(0L, 
    1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L)), row.names = c(NA, 
30L), class = "data.frame")

CodePudding user response:

First thing, we should pivot_longer to pull the four posture columns into name-value pairs. Here I've put the names into the "Posture" column. Then we can map that to color and use the values for the y axis.

I've specified the range in scale_y_continuous, but it could also be done with coord_cartesian(ylim = c(0.5,4.5)) -- the difference will be that the out of range points are filtered out in this way, but are in some sense "still there" if you use the coord_cartesian option. That can make a difference if you are doing a summary step, like geom_boxplot or geom_smooth.

Finally, I use theme to specify the y-axis related elements that should be hidden.

library(tidyverse)
graph %>%
  mutate(day = lubridate::day(Date)) %>%
  pivot_longer(Standing:New_Sitting, names_to = "Posture") %>%
ggplot(aes(x = Time, y = value, color = Posture)) 
  geom_point() 
  scale_y_continuous(limits = c(0.5,4.5), expand = expansion(0))  
  facet_wrap(~day, scales = "free_x")  
  labs(title = "Posture vs. Time")  
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())

enter image description here

CodePudding user response:

Here you go:

library(tidyverse)

graph_pre_long <- graph_pre %>% pivot_longer(c(Standing, New_Sitting , Stepping, Cycling), names_to = "Posture")

ggplot(graph_pre_long, aes(x = Time, y = value, color = Posture)) 
  geom_point() 
  facet_wrap(~day, scales = "free_x")   
  ylim(.5, 4.5)   
  theme(axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank())
  • Related