R语言 是什么导致我的ggplot2箱线图使用width参数变成了细线而不是宽框?

sc4hvdpw  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(153)

我在R studio中与boxplots斗争。我有一个数据集,看起来像这样:
| 现场|日期|氯化物_mgL|
| - -----|- -----|- -----|
| B| 2021-06-08 12:00:00| 29.13800|
| D| 2021-06-08 12:00:00| 29.41100|
| D| 2021-06-15 12:00:00| 29.92400|
| E级|2021-06-08 12:00:00| 29.29100|
| 一个|2021-06-08 12:00:00| 29.16800|
| D| 2021-06-22 12:00:00| 32.79500|
| C类|2021-06-22 12:00:00| 30.59200|
地点是字符,日期是POSIX,氯化物是数字。我需要制作箱形图,x轴为日期,y轴为氯化物,按日期分组。因此,例如,我需要一个2021-06-08 12:00:00的框,该框由该日期/时间所有研究中心的所有氯化物值组成。我可以做出来,但是由于某些原因,当我做的时候,盒子很小,我需要它们更大,但是width =函数只是把盒子变成了细线,而不是盒子。
这就是我如何制作箱线图:

c <- ggplot(sylvan[sylvan$Site %in% c("A", "B", "C", "D", "E", "F", "G") & sylvan$Chloride_mgL > 25, ], aes(x = date, y = Chloride_mgL, group = date)) + 
  geom_boxplot(outlier.shape = NA, color = "dark blue") + theme_minimal() + labs(y ="Chloride (mg/L)")
c

这给出了:

太好了,但我想要更大的盒子。所以我尝试使用width参数:

c <- ggplot(sylvan[sylvan$Site %in% c("A", "B", "C", "D", "E", "F", "G") & sylvan$Chloride_mgL > 25, ], aes(x = date, y = Chloride_mgL, group = date)) + 
  geom_boxplot(width = 2, outlier.shape = NA, color = "dark blue") + theme_minimal() + labs(y ="Chloride (mg/L)")
c

然后它变成了这个:

我怎样才能使方框变宽而不是变成细线条呢?非常感谢!
编辑:尝试@TarJae解决方案,结果是这样的:enter image description here

db2dz4w8

db2dz4w81#

以下是POSIXct中每日数据的箱线图示例:

set.seed(42)
df <- data.frame(date = sample(lubridate::ymd_h(c(
  2023040100, 2023050800, 2023051500, 2023051600)), 100, replace = TRUE),
  mgL = rnorm(100, mean = 29))

连续轴上箱线图的默认间距将找到适合该空间的分辨率。

ggplot(df, aes(date, mgL, group = date)) +
  geom_boxplot()

如果我们指定width = 1,盒子将是1个单位宽,在POSIX中是1秒,导致盒子太窄。

ggplot(df, aes(date, mgL, group = date)) +
  geom_boxplot(width = 1)

在7天间隔的情况下,前两根柱宽为一周,但最后两根(相隔一天)被挤压在一起,形成更窄的柱。

ggplot(df, aes(date, mgL, group = date)) +
  geom_boxplot(width = 60*60*24*7)

或者我们可以将x轴转换为日期,其中一个单位是一天。宽度为1时,最后两个条将排成一行,中间没有空间。任何更宽的和ggplot将挤压重叠的,以避免重叠。

ggplot(df, aes(as.Date(date), mgL, group = date)) +
  geom_boxplot(width = 1)

mec1mxoz

mec1mxoz2#

问题是datetime类。尝试整个过程中留下的日期作为字符的宽度应该工作。

这个解释直接取自@Jon Spring的评论:

“boxplot width 1将使方框宽度为1个单位。对于x轴上的POSIXct,1个单位是1秒,这对于这个数据来说太窄了。例如,尝试使用width = 60 * 60 * 24 * 5使它们的宽度为5天。棘手的B/c我看到一些比这更接近,所以你会有重叠”

library(lubridate)
library(dplyr)

df %>% 
  mutate(date = ymd_hms(date)) %>% 
  ggplot(aes(x = date, y = Chloride_mgL, group = date)) + 
  geom_boxplot(width = 2, outlier.shape = NA, color = "dark blue") + 
  theme_minimal() + 
  labs(y ="Chloride (mg/L)")

library(dplyr)
df %>% 
  ggplot(aes(x = date, y = Chloride_mgL, group = date)) + 
  geom_boxplot(width = 2, outlier.shape = NA, color = "dark blue") +
  theme_minimal() +
  labs(y = "Chloride (mg/L)")

相关问题