Я хотел бы построить два кадра данных на одном графике - PullRequest
0 голосов
/ 24 апреля 2019

Я довольно новичок в R и пытаюсь построить кадры данных одновременно, используя ggplot2.

У меня есть два фрейма данных.

Один из них называется WorkSchedMonday и состоит из 96 строк и 4 столбцов.

structure(c(9, 9, 9, 9, 18, 18, 36, 36, 36, 36, 64, 80, 96, 96, 
112, 128, 168, 168, 296, 312, 14, 14, 14, 21, 21, 21, 21, 35, 
49, 49, 12, 12, 6, 6, 0, 0, 0, 0, 6, 6), .Dim = c(10L, 4L), .Dimnames = list(
    c("04:00", "04:15", "04:30", "04:45", "05:00", "05:15", "05:30", 
    "05:45", "06:00", "06:15"), c("WorkSchedAndIndivMondayAtHome", 
    "WorkSchedAndIndivMondayAtSingleWorkPlace", "WorkSchedAndIndivMondayAtVarietyOfPlaces", 
    "WorkSchedAndIndivMondayWorkingOnTheMove")))

Другой называется WorkSchedTuesday и состоит из 96 строк и 4 столбцов.

 structure(c(0, 0, 0, 0, 9, 9, 27, 27, 36, 36, 64, 80, 96, 96, 
112, 128, 168, 168, 296, 312, 14, 14, 14, 21, 21, 21, 21, 35, 
49, 49, 12, 12, 6, 6, 0, 0, 0, 0, 6, 6), .Dim = c(10L, 4L), .Dimnames = list(
    c("04:00", "04:15", "04:30", "04:45", "05:00", "05:15", "05:30", 
    "05:45", "06:00", "06:15"), c("WorkSchedAndIndivTuesdayAtHome", 
    "WorkSchedAndIndivTuesdayAtSingleWorkPlace", "WorkSchedAndIndivTuesdayAtVarietyOfPlaces", 
    "WorkSchedAndIndivTuesdayWorkingOnTheMove")))

Используя следующий код, построены 2 фрейма данных.

WorkSchedWeek<-as.matrix(cbind(WorkSchedAndIndivMondayAtHome,WorkSchedAndIndivMondayAtSingleWorkPlace,WorkSchedAndIndivMondayAtVarietyOfPlaces, WorkSchedAndIndivMondayWorkingOnTheMove, WorkSchedAndIndivTuesdayAtHome,WorkSchedAndIndivTuesdayAtSingleWorkPlace,WorkSchedAndIndivTuesdayAtVarietyOfPlaces, WorkSchedAndIndivTuesdayWorkingOnTheMove))



####


melted_WorkSchedWeek<- melt(WorkSchedWeek)


plot<-ggplot(melted_WorkSchedWeek) + geom_col(aes(x = Var1,y = value,fill = Var2),position = "fill")  + theme(legend.position="right", axis.text.x = element_text(angle = 90, hjust = 1))


plot + labs(x="Time", y="Probabilities", colour="Work schedules", fill="Work schedules") 

Timing work schedules

New plot

Однако я хотел бы создать вышеприведенный график, используя ggplot (или решетку). На оси х - время (с 04:00 до 03:45 _ 24 часа) в сутки (понедельник и вторник), распределение вероятностей по оси Y. Участок заполнен значениями графиков работы. Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

4 голосов
/ 25 апреля 2019

Вы можете использовать facet_grid для создания двух графиков рядом, но с общей осью. Но для этого необходимо сначала объединить два кадра данных.

Для этого мы стандартизируем ваши переменные, добавим столбец дня, столбец времени и затем используем rbind:

WorkSchedMonday = data.frame(structure(c(9, 9, 9, 9, 18, 18, 36, 36, 36, 36, 64, 80, 96, 96, 
  112, 128, 168, 168, 296, 312, 14, 14, 14, 21, 21, 21, 21, 35, 
  49, 49, 12, 12, 6, 6, 0, 0, 0, 0, 6, 6), .Dim = c(10L, 4L), .Dimnames = list(
  c("04:00", "04:15", "04:30", "04:45", "05:00", "05:15", "05:30", 
  "05:45", "06:00", "06:15"), c("WorkSchedAndIndivMondayAtHome", 
  "WorkSchedAndIndivMondayAtSingleWorkPlace", "WorkSchedAndIndivMondayAtVarietyOfPlaces", 
  "WorkSchedAndIndivMondayWorkingOnTheMove"))))
names(WorkSchedMonday) = c("AtHome", "SingleWork", "Variety", "OnTheMove")
WorkSchedMonday$time = rownames(WorkSchedMonday)

WorkSchedTuesday = data.frame(structure(c(0, 0, 0, 0, 9, 9, 27, 27, 36, 36, 64, 80, 96, 96, 
  112, 128, 168, 168, 296, 312, 14, 14, 14, 21, 21, 21, 21, 35, 
  49, 49, 12, 12, 6, 6, 0, 0, 0, 0, 6, 6), .Dim = c(10L, 4L), .Dimnames = list(
  c("04:00", "04:15", "04:30", "04:45", "05:00", "05:15", "05:30", 
  "05:45", "06:00", "06:15"), c("WorkSchedAndIndivMondayAtHome", 
  "WorkSchedAndIndivMondayAtSingleWorkPlace", "WorkSchedAndIndivMondayAtVarietyOfPlaces", 
  "WorkSchedAndIndivMondayWorkingOnTheMove"))))
names(WorkSchedTuesday) = c("AtHome", "SingleWork", "Variety", "OnTheMove")
WorkSchedTuesday$time = rownames(WorkSchedTuesday)

WorkSchedMonday$day =  "Monday"
WorkSchedTuesday$day =  "Tuesday"
WorkSched = rbind(WorkSchedMonday, WorkSchedTuesday)

Сделав это, вы можете растопить свой фрейм данных, как вы делали раньше, и запустить тот же ggplot, но с facet_grid вдоль переменной, на которую вы хотите, чтобы ваш график был разделен (день).

WorkSched_melt = melt(WorkSched, id.vars = c("time", "day"))
ggplot(WorkSched_melt, aes(x = time, y = value, fill = variable)) + geom_col(position = "fill") + 
  facet_grid(. ~ day) + theme(legend.position="right", axis.text.x = element_text(angle = 90, hjust = 1))

resulting plot

Как правило, избегайте использования действительно больших и неуклюжих имен переменных, а также избегайте использования необходимой переменной (в данном случае, time) в качестве имени строки.

2 голосов
/ 25 апреля 2019

Вот решение с кодом подготовки данных, сделанное с пакетом dplyr.

library(ggplot2)
library(dplyr)

WorkSchedWeek <- cbind(WorkSchedMonday, WorkSchedTuesday)
WorkSchedWeek <- as.data.frame(WorkSchedWeek)
WorkSchedWeek <- cbind.data.frame(Hour = row.names(WorkSchedWeek), WorkSchedWeek)

melted_WorkSchedWeek <- reshape2::melt(WorkSchedWeek, id.vars = "Hour")

melted_WorkSchedWeek %>%
  mutate(variable = sub("^WorkSchedAndIndiv", "", variable),
         Month = sub("(^.{3}).*", "\\1", variable),
         variable = sub("^.*day", "", variable)) %>%
  ggplot(aes(x = Hour,y = value, fill = variable)) + 
  geom_col(position = "fill") + 
  theme(legend.position = "right", 
        axis.text.x = element_text(angle = 90, hjust = 1)) +
  facet_wrap(~ Month)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...