【问题标题】:I would like to plot two data frames on a single plot我想在一个图上绘制两个数据框
【发布时间】:2019-09-14 05:55:39
【问题描述】:

我对 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") 

但是我想使用 ggplot (or lattice) 创建上面的图。 x 轴是每天(星期一和星期二)的时间(0400 到 0345 _ 24 小时),y 轴是概率分布。该图充满了工作计划值。有人可以帮助我吗?谢谢

【问题讨论】:

  • 如果您能以一种便于其他人加载的方式共享数据,将会更容易提供帮助。最佳做法是将dput(head(WorkSchedMonday, 10))dput(head(WorkSchedTuesday, 10)) 的输出添加到您的问题中。
  • @JonSpring 谢谢我更新了我的问题。
  • 我不明白这个草图代表什么类型的图表。堆叠的酒吧?一张桌子?
  • @camille geom_col 但有更好的方法

标签: r dataframe matrix ggplot2


【解决方案1】:

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

作为一般规则,避免使用非常大且笨拙的变量名称,同时避免使用必要的变量(在本例中为时间)作为行名称。

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 2017-08-13
      • 2017-07-28
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多