我想在一个图上绘制两个数据框

时间:2019-04-24 20:58:36

标签: r dataframe matrix ggplot2

我对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(或点阵)来创建上面的图。 x轴上的时间是每天(星期一和星期二)的时间(0400到0345 _ 24小时),y轴的概率分布。该图填充有工作计划值。有人可以帮我吗?谢谢

2 个答案:

答案 0 :(得分:4)

您可以使用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

通常,请避免使用过大而笨拙的变量名,并避免将必要的变量(在这种情况下为时间)用作行名。

答案 1 :(得分:2)

这是一个解决方案,其中数据准备代码由程序包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