【问题标题】:ggplot2: Reshaping data to plot multiple Y values for each X Valueggplot2:重塑数据以绘制每个 X 值的多个 Y 值
【发布时间】:2017-11-01 12:41:50
【问题描述】:

我有一个数据框,其中包含 2 周的数据,这些数据表明每天有多少乘客乘坐火车。每个观察值包含 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 个:

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

我已经看到 reshape 用于熔化此类实例的数据,但是当我使用星期几作为 id.vars 值熔化时,日期被转换为科学记数法(小问题)但 ggplot 找不到乘客变量(大问题)。

【问题讨论】:

    标签: r ggplot2 reshape melt


    【解决方案1】:

    需要解决的一些问题:

    1. 您指定了fill = variable,但您的数据框中没有名为“变量”的变量;
    2. 您希望 2 个闪避的条并排,但没有指示如何进行闪避。

    我会先处理数据框:

    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
    

    这会添加一个“星期”变量,前 7 个值的值为 42,接下来的 7 个值为 43。现在一周中的天数也从周一到周日排序。

    ggplot(df, 
           aes(x = dow, y = passengers, fill = week)) + 
      geom_col(position = "dodge")
    

    geom_col() 等价于geom_bar(stat = "identity"),但需要的输入更少。

    【讨论】:

    • 所以关键是添加一个标识符变量,显示有 2 个不同的周。如果我们指示没有填充值,这仍然会躲避还是会继续存在相同的问题? @Z.Lin
    • @Brad 如果您不需要不同的填充颜色来方便比较,另一种方法是在aes() 中包含group = total。这告诉包您希望将“总计”的每个值(即每天)视为一组,从而导致按天躲避条形。如果您不指定任何标识符,则每天的条形图将在同一位置重叠(您可以通过降低 geom_bar 的透明度来验证这一点,例如设置 alpha = 0.5
    • 在保持我的数据框与以前相似并添加一周列的情况下,我能够创建图表。 (我还没有学习 dplyr)但是,我的 X 值的排序方式不同,所以图表是星期五,星期一,星期六......我猜是因为你按照你的方式订购了你的“级别”参数,它保持一周中的日子井井有条? @Z.Lin
    • @Brad 是的,默认情况下,ggplot 沿轴按字母顺序排列字符变量的值;另一方面,因子变量遵循其级别指定的顺序。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2020-11-16
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2019-11-17
    • 2012-10-26
    相关资源
    最近更新 更多