如何使用 ggplot2 在具有离散 x 刻度的分组箱线图之间移动刻度和标签?

问题描述 投票:0回答:1

当然已经问过,但我正在努力寻找适合我的情况的明确解决方案。

如何在分组箱线图之间移动刻度(而不是以它们为中心)以便定义小时间隔?

初始数据:
By default, hours are centered on grouped boxplots

所需输出:
Hours positionned in-between grouped boxplots, i.e. to define hours intervals

数据:

dat0 <- 
structure(list(group = c("A", "B", "A", "B", "A", "B", "A", "B", 
"A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", 
"B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", 
"A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", 
"B"), hour = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 
5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 12L, 
12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 
19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 23L, 23L, 24L, 24L), levels = 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"
), class = "factor"), q05 = c(38, 42, 38, 42, 34, 42, 35, 40, 
39, 40, 42, 49, 50, 56, 53, 61, 55, 59, 50, 58, 50, 58, 47, 55, 
46, 54, 48, 54, 48, 50, 46, 50, 46, 49, 44, 46, 44, 48, 41, 45, 
42, 44, 39, 45, 38, 42, 38, 41), q25 = c(48, 55, 47, 53, 44, 
53, 43, 51, 48, 53, 54, 64, 60, 74, 80, 96, 72, 81, 64, 77, 63, 
78, 61, 77, 60, 75, 62, 73, 60, 65, 58, 63, 59, 63, 55, 61, 53, 
61, 51, 55, 51, 59, 47, 58, 46, 54, 46, 53), q50 = c(56, 67, 
55, 66, 50, 65, 51, 63, 58, 65, 68, 84, 71, 94, 122, 135, 93, 
102, 81, 97, 80, 99, 80, 98, 75, 96, 82, 95, 74, 84, 72, 82, 
70, 79, 69, 74, 64, 76, 62, 70, 62, 76, 56, 71, 56, 69, 55, 66
), q75 = c(74, 88, 70, 88, 60, 83, 65, 84, 84, 88, 101, 129, 
93, 125, 167, 184, 131, 139, 117, 126, 111, 134, 112, 132, 124, 
139, 115, 128, 99, 112, 98, 113, 90, 105, 92, 100, 84, 102, 95, 
120, 86, 100, 73, 87, 76, 90, 70, 84), q95 = c(147, 135, 172, 
150, 124, 144, 136, 165, 320, 189, 265, 256, 239, 249, 268, 307, 
215, 262, 201, 215, 200, 216, 201, 233, 225, 237, 176, 233, 193, 
205, 165, 186, 170, 194, 160, 170, 222, 223, 203, 210, 166, 162, 
178, 152, 142, 167, 145, 129)), row.names = c(NA, -48L), class = "data.frame")    

# plot
ggplot(dat0, aes(x = hour)) +
  theme(
    legend.position="top",
    legend.title = element_blank(),
    panel.grid.major = element_blank()
  ) +
  geom_boxplot(
    aes(y = q50,
        fill = factor(group, levels = c('A', 'B')),
        ymin = q05, lower = q25, middle = q50, upper = q75, ymax = q95),
    stat = "identity",
    width = 0.8,
    position = position_dodge2(width = 1)
  )

感谢您的帮助

ggplot2 group-by intervals xticks discrete
1个回答
0
投票

通过将

hour
列更改为数字,我得到了以下结果。

library(tidyverse)
dat0 <- 
  structure(list(group = c("A", "B", "A", "B", "A", "B", "A", "B", 
                           "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", 
                           "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", 
                           "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", 
                           "B"), 
                 hour = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 
                                    5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 12L, 
                                    12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 
                                    19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 23L, 23L, 24L, 24L), levels = 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"
                                    ), class = "factor"), 
                 q05 = c(38, 42, 38, 42, 34, 42, 35, 40, 
                         39, 40, 42, 49, 50, 56, 53, 61, 55, 59, 50, 58, 50, 58, 47, 55, 
                         46, 54, 48, 54, 48, 50, 46, 50, 46, 49, 44, 46, 44, 48, 41, 45, 
                         42, 44, 39, 45, 38, 42, 38, 41), 
                 q25 = c(48, 55, 47, 53, 44, 
                         53, 43, 51, 48, 53, 54, 64, 60, 74, 80, 96, 72, 81, 64, 77, 63, 
                         78, 61, 77, 60, 75, 62, 73, 60, 65, 58, 63, 59, 63, 55, 61, 53, 
                         61, 51, 55, 51, 59, 47, 58, 46, 54, 46, 53), 
                 q50 = c(56, 67, 55, 66, 50, 65, 51, 63, 58, 65, 68, 84, 71, 94, 122, 135, 93, 
                         102, 81, 97, 80, 99, 80, 98, 75, 96, 82, 95, 74, 84, 72, 82, 
                         70, 79, 69, 74, 64, 76, 62, 70, 62, 76, 56, 71, 56, 69, 55, 66
                 ), 
                 q75 = c(74, 88, 70, 88, 60, 83, 65, 84, 84, 88, 101, 129, 
                         93, 125, 167, 184, 131, 139, 117, 126, 111, 134, 112, 132, 124, 
                         139, 115, 128, 99, 112, 98, 113, 90, 105, 92, 100, 84, 102, 95, 
                         120, 86, 100, 73, 87, 76, 90, 70, 84), 
                 q95 = c(147, 135, 172, 150, 124, 144, 136, 165, 320, 189, 265, 256, 239, 249, 268, 307, 
                         215, 262, 201, 215, 200, 216, 201, 233, 225, 237, 176, 233, 193, 
                         205, 165, 186, 170, 194, 160, 170, 222, 223, 203, 210, 166, 162, 
                         178, 152, 142, 167, 145, 129)), row.names = c(NA, -48L), class = "data.frame")    

dat0 <- dat0 |> mutate(hour = as.numeric(hour))
# plot
ggplot(dat0, aes(x = hour)) +
  theme(
    legend.position="top",
    legend.title = element_blank(),
    panel.grid.major = element_blank()
  ) +
  geom_boxplot(
    aes(y = q50, group = interaction(hour, group),
        fill = group,
        ymin = q05, lower = q25, middle = q50, upper = q75, ymax = q95),
    stat = "identity",
    width = 0.8,
    position = position_dodge2(width = 1)
  ) +
  scale_x_continuous(breaks = (1:25)-0.5, labels = 0:24)

Boxplot

创建于 2024 年 11 月 23 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.