R ggplot2:重塑数据以为每个X值绘制多个Y值

R ggplot2:重塑数据以为每个X值绘制多个Y值,r,ggplot2,reshape,melt,R,Ggplot2,Reshape,Melt,我有一个数据框,其中包含两周的数据,表明每天有多少乘客在火车上。每个观察值包含3个值:日期、乘客人数和一周中的哪一天。我想比较一下前一周到本周(周一到周一、周二到周二等)每天的乘客人数。以下是数据: structure(list(total = structure(c(17455, 17456, 17457, 17458, 17459, 17460, 17461, 17462, 17463, 17464, 17465, 17466, 17467, 17468), class = "Date"

我有一个数据框,其中包含两周的数据,表明每天有多少乘客在火车上。每个观察值包含3个值:日期、乘客人数和一周中的哪一天。我想比较一下前一周到本周(周一到周一、周二到周二等)每天的乘客人数。以下是数据:

structure(list(total = structure(c(17455, 17456, 17457, 17458, 
17459, 17460, 17461, 17462, 17463, 17464, 17465, 17466, 17467, 
17468), class = "Date"), passengers = c(9299L, 9166L, 10234L, 
10176L, 10098L, 2867L, 5416L, 9312L, 10555L, 10858L, 10169L, 
9515L, 2679L, 5490L), dow = c("Monday", "Tuesday", "Wednesday", 
"Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", 
"Wednesday", "Thursday", "Friday", "Saturday", "Sunday")), .Names = 
c("total", "passengers", "dow"), class = "data.frame")
(创建报告的自动化系统使用“总计”一词表示日期,我觉得有必要指出这一点,因为这可能会令人困惑)

创建ggplot时,它只映射条形图的1个y值,而不是并排映射2个y值:

ggplot(x, aes(x=dow, y=passengers), fill=variable) + 
  geom_bar(stat = "identity", position = "dodge")

我见过Reforme用于融化此类实例的数据,但当我使用星期几作为id.vars值进行融化时,日期转换为科学符号(小问题),但ggplot无法找到乘客变量(大问题)。

需要解决的一些问题:

  • 您指定了
    fill=variable
    ,但数据框中没有名为“variable”的变量
  • 你期望两个闪避栏并排出现,但没有迹象表明如何闪避
  • 我将首先讨论数据帧:

    library(dplyr)
    
    df <- x %>%
      mutate(week = format(total, "%V"),
             dow = factor(dow, levels = c("Monday", "Tuesday", "Wednesday", "Thursday",
                                          "Friday", "Saturday", "Sunday")))
    
    > head(df)
           total passengers       dow week
    1 2017-10-16       9299    Monday   42
    2 2017-10-17       9166   Tuesday   42
    3 2017-10-18      10234 Wednesday   42
    4 2017-10-19      10176  Thursday   42
    5 2017-10-20      10098    Friday   42
    6 2017-10-21       2867  Saturday   42
    
    geom_col()
    相当于
    geom_bar(stat=“identity”)
    ,但需要更少的键入


    需要解决的一些问题:

  • 您指定了
    fill=variable
    ,但数据框中没有名为“variable”的变量
  • 你期望两个闪避栏并排出现,但没有迹象表明如何闪避
  • 我将首先讨论数据帧:

    library(dplyr)
    
    df <- x %>%
      mutate(week = format(total, "%V"),
             dow = factor(dow, levels = c("Monday", "Tuesday", "Wednesday", "Thursday",
                                          "Friday", "Saturday", "Sunday")))
    
    > head(df)
           total passengers       dow week
    1 2017-10-16       9299    Monday   42
    2 2017-10-17       9166   Tuesday   42
    3 2017-10-18      10234 Wednesday   42
    4 2017-10-19      10176  Thursday   42
    5 2017-10-20      10098    Friday   42
    6 2017-10-21       2867  Saturday   42
    
    geom_col()
    相当于
    geom_bar(stat=“identity”)
    ,但需要更少的键入


    因此,关键是添加一个标识符变量,显示有两个不同的星期。如果我们指示没有填充值,这仍然会闪避还是会继续存在相同的问题@ZLin@Brad如果不需要不同的填充颜色来方便比较,另一种方法是在
    aes()中包含
    group=total
    。这会告诉程序包,您希望将“total”(即每天)的每个值作为一个组处理,从而使条按天闪避。如果您没有指出任何标识符,则每天的条形图将在同一位置重叠(您可以通过降低
    geom_bar
    的透明度来验证这一点,例如设置
    alpha=0.5
    )在保持我的数据框与之前相似的情况下,并添加一个week列,我能够创建图表。(我还没有学会dplyr)但是,我的X值排序不同,所以图表显示的是星期五、星期一、星期六。。。。我猜,因为你按照你的方式排列了你的“等级”论点,它使一周中的每一天都井然有序@ZLin@Brad是的,默认情况下,ggplot沿轴按字母顺序排列字符变量的值;另一方面,因子变量遵循其级别指定的顺序。因此,关键是添加一个标识符变量,显示有两个不同的星期。如果我们指示没有填充值,这仍然会闪避还是会继续存在相同的问题@ZLin@Brad如果不需要不同的填充颜色来方便比较,另一种方法是在
    aes()中包含
    group=total
    。这会告诉程序包,您希望将“total”(即每天)的每个值作为一个组处理,从而使条按天闪避。如果您没有指出任何标识符,则每天的条形图将在同一位置重叠(您可以通过降低
    geom_bar
    的透明度来验证这一点,例如设置
    alpha=0.5
    )在保持我的数据框与之前相似的情况下,并添加一个week列,我能够创建图表。(我还没有学会dplyr)但是,我的X值排序不同,所以图表显示的是星期五、星期一、星期六。。。。我猜,因为你按照你的方式排列了你的“等级”论点,它使一周中的每一天都井然有序@ZLin@Brad是的,默认情况下,ggplot沿轴按字母顺序排列字符变量的值;另一方面,因子变量遵循其级别指定的顺序。