【问题标题】:Grouped stacked bar chart in ggplot2 where each stack corresponds to its y axis valueggplot2中的分组堆积条形图,其中每个堆栈对应于其y轴值
【发布时间】:2020-10-10 03:20:45
【问题描述】:

我想知道我的请求在 ggplot2 中是否可行。

我希望增强条形图,其中我按小时 (1:24) 对两个条形图进行分组,对应于模型 1 和模型 2 在 MAPE 中测量的误差(平均绝对百分比误差),其中小时是 x 轴,MAPE 绘制在y 轴。

我解释的图表简单且信息丰富,但我希望做的改进是按日期用 MAPE 填充每个条形图。日期是我数据框中的第四列。我希望填充对应于给定日期产生的 MAPE 值 model1 或 model2。

到目前为止,我所能绘制的只是构成给定模型栏中总 MAPE 计算的每个日期。从某种意义上说,它提供了信息,它显示了在错误计算中使用了哪些日期,但它并没有告诉查看者哪些日期对最小/最大模型错误负责。

我将我的数据粘贴在帖子底部以避免混乱。以下是我目前的结果:

我第一次尝试使用 facet_grid,结果如下:

ggplot(Hourly_compare, aes(x = Hour, y = MAPE, fill = as.factor(Date)))+
  geom_bar(position= "stack", stat = "identity") + facet_grid(~ Model)

如您所见,每个日期的填充在每个条中的长度相同。我希望日期的填充与给定日期的 MAPE 值相对应。

我的第二次尝试产生了这个粗糙的图表:

ggplot(Hourly_compare, aes(x = Hour, y = MAPE, fill = as.factor(Date), color = Model))+
  geom_bar(position= "stack", stat = "identity") +
  scale_color_manual(values=c("Model1"="red", "Model2"="black"))+
  scale_x_continuous(breaks = c(1:24))

这对我来说更理想,因为我希望将每个模型的结果按小时分组为单独的条形图,但我希望将条形图与每个日期的模型错误堆叠在一起,这些错误对应于它们的 MAPE 值。

这是我的数据:

Hourly_compare <- dput(Hourly_compare)
structure(list(Date = structure(c(18405, 18405, 18405, 18405, 
18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18412, 
18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
18412, 18412, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
18419, 18419, 18419, 18419, 18419), class = "Date"), Hour = c(1, 
1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 
11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 
19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 1, 1, 2, 2, 3, 3, 
4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 
13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 
21, 22, 22, 23, 23, 24, 24, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 
6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 
15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 
23, 23, 24, 24), Model = c("Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2", 
"Model1", "Model2", "Model1", "Model2", "Model1", "Model2", "Model1", 
"Model2", "Model1", "Model2", "Model1", "Model2", "Model1", "Model2"
), MAPE = c(0.45, 1.33, 0.41, 1.17, 0.4, 1.23, 0.45, 1.32, 0.45, 
1.48, 0.62, 1.82, 0.7, 1.69, 0.69, 1.16, 1.37, 1.56, 1.56, 1.48, 
1.64, 1.42, 1.48, 1.45, 1.23, 1.42, 1.18, 1.66, 1.22, 1.8, 1.36, 
2.21, 1.61, 2.5, 1.99, 2.87, 1.93, 2.55, 2.01, 2.61, 1.82, 2.75, 
1.92, 2.53, 1.71, 2.31, 1.5, 2.04, 0.45, 1.33, 0.41, 1.17, 0.4, 
1.23, 0.45, 1.32, 0.45, 1.48, 0.62, 1.82, 0.7, 1.69, 0.69, 1.16, 
1.37, 1.56, 1.56, 1.48, 1.64, 1.42, 1.48, 1.45, 1.23, 1.42, 1.18, 
1.66, 1.22, 1.8, 1.36, 2.21, 1.61, 2.5, 1.99, 2.87, 1.93, 2.55, 
2.01, 2.61, 1.82, 2.75, 1.92, 2.53, 1.71, 2.31, 1.5, 2.04, 0.45, 
1.33, 0.41, 1.17, 0.4, 1.23, 0.45, 1.32, 0.45, 1.48, 0.62, 1.82, 
0.7, 1.69, 0.69, 1.16, 1.37, 1.56, 1.56, 1.48, 1.64, 1.42, 1.48, 
1.45, 1.23, 1.42, 1.18, 1.66, 1.22, 1.8, 1.36, 2.21, 1.61, 2.5, 
1.99, 2.87, 1.93, 2.55, 2.01, 2.61, 1.82, 2.75, 1.92, 2.53, 1.71, 
2.31, 1.5, 2.04)), row.names = c(NA, -144L), groups = structure(list(
    Date = structure(c(18405, 18405, 18405, 18405, 18405, 18405, 
    18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
    18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 18405, 
    18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
    18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 18412, 
    18412, 18412, 18412, 18412, 18412, 18412, 18419, 18419, 18419, 
    18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
    18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 18419, 
    18419, 18419, 18419), class = "Date"), Hour = c(1, 2, 3, 
    4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
    20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
    13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 1, 2, 3, 
    4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
    20, 21, 22, 23, 24), .rows = list(1:2, 3:4, 5:6, 7:8, 9:10, 
        11:12, 13:14, 15:16, 17:18, 19:20, 21:22, 23:24, 25:26, 
        27:28, 29:30, 31:32, 33:34, 35:36, 37:38, 39:40, 41:42, 
        43:44, 45:46, 47:48, 49:50, 51:52, 53:54, 55:56, 57:58, 
        59:60, 61:62, 63:64, 65:66, 67:68, 69:70, 71:72, 73:74, 
        75:76, 77:78, 79:80, 81:82, 83:84, 85:86, 87:88, 89:90, 
        91:92, 93:94, 95:96, 97:98, 99:100, 101:102, 103:104, 
        105:106, 107:108, 109:110, 111:112, 113:114, 115:116, 
        117:118, 119:120, 121:122, 123:124, 125:126, 127:128, 
        129:130, 131:132, 133:134, 135:136, 137:138, 139:140, 
        141:142, 143:144)), row.names = c(NA, -72L), class = c("tbl_df", 
"tbl", "data.frame")), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"))

非常感谢任何帮助!谢谢你。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我不认为你的情节有什么问题;它只显示您的数据中的内容。每个小时的 MAPE在每个日期都相同。看:

    Hourly_compare %>% filter(Model == "Model1") %>% arrange(Hour)
    # A tibble: 72 x 4
    # Groups:   Date, Hour [72]
       Date        Hour Model   MAPE
       <date>     <dbl> <chr>  <dbl>
     1 2020-05-23     1 Model1  0.45
     2 2020-05-30     1 Model1  0.45
     3 2020-06-06     1 Model1  0.45
     4 2020-05-23     2 Model1  0.41
     5 2020-05-30     2 Model1  0.41
     6 2020-06-06     2 Model1  0.41
     7 2020-05-23     3 Model1  0.4 
     8 2020-05-30     3 Model1  0.4 
     9 2020-06-06     3 Model1  0.4 
    10 2020-05-23     4 Model1  0.45
    

    您可以看到,对于第 1 小时的三个日期中的每一个,MAPE 为 0.45,在第 2 小时的三个日期中的每一个都为 0.41,依此类推。这种模式贯穿始终:

    Hourly_compare %>% filter(Model == "Model2") %>% arrange(-Hour)
    # A tibble: 72 x 4
    # Groups:   Date, Hour [72]
       Date        Hour Model   MAPE
       <date>     <dbl> <chr>  <dbl>
     1 2020-05-23    24 Model2  2.04
     2 2020-05-30    24 Model2  2.04
     3 2020-06-06    24 Model2  2.04
     4 2020-05-23    23 Model2  2.31
     5 2020-05-30    23 Model2  2.31
     6 2020-06-06    23 Model2  2.31
     7 2020-05-23    22 Model2  2.53
     8 2020-05-30    22 Model2  2.53
     9 2020-06-06    22 Model2  2.53
    10 2020-05-23    21 Model2  2.75
    # ... with 62 more rows
    

    因此,您应该期望每个条形中的三种颜色具有相同的大小。

    【讨论】:

    • Hourly_compare %&gt;% group_by(Model, Date) %&gt;% summarise(S = sum(MAPE))
    • 你说得对。太尴尬了,我需要重新计算重新尝试。一旦我这样做,我应该能够编辑我的帖子。很抱歉没听清楚。
    • 一点也不尴尬@user3720887。有时,您需要用新的眼光来看待问题,才能找到您忽略的问题。关于 SO 的一个问得很好的问题是让人们重新审视它的好方法,这就是你所做的。我猜你现有的代码可以很好地处理你的固定数据。
    • 是的,确实如此。现在我已经修复了 facet_grid 选项看起来最干净。谢谢你,艾伦。介意我删除帖子吗?
    • 当然@user3720887。不用担心
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2019-01-14
    相关资源
    最近更新 更多