繁体   English   中英

ggplot2 中的分组堆积条形图,其中每个堆栈对应于其 y 轴值

[英]Grouped stacked bar chart in ggplot2 where each stack corresponds to its y axis value

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

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

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

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

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

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

在此处输入图像描述

这对我来说更理想,因为我希望将每个模型的结果按小时分组为单独的条形图,但我希望这些条形图与每个日期的 model 错误与其 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"))

任何帮助深表感谢。 谢谢你。

我不认为你的 plot 有什么问题; 它只显示您的数据中的内容。 每个日期每个小时的 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

您可以看到 MAPE 对于第 1 小时的三个日期中的每一个都是 0.45,在第二小时的三个日期中的每一个都是 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM