有人可以解释为什么我的第一个 ggplot2 箱形图只是一个大盒子以及解决方案是如何工作的吗?

Can someone explain why my first ggplot2 box plot was just one big box and how the solution worked?

所以我的第一个 ggplot2 箱线图只是一个大的延伸箱线图,第二个是正确的,但我不明白发生了什么变化以及为什么第二个有效。我是 R 和 ggplot2 的新手,如果可以请告诉我,谢谢。

#----------------------------------------------------------
#    This is the original ggplot that didn't work:
#----------------------------------------------------------
zSepalFrame <- data.frame(zSepalLength, zSepalWdth)
zPetalFrame <- data.frame(zPetalLength, zPetalWdth)

p1 <- ggplot(data = zSepalFrame, mapping = aes(x=zSepalWdth, y=zSepalLength, group = 4)) +  #fill = zSepalLength
  geom_boxplot(notch=TRUE) +
  stat_boxplot(geom = 'errorbar', width = 0.2) +
  theme_classic() +
  labs(title = "Iris Data Box Plot") +
  labs(subtitle ="Z Values of Sepals From Iris.R")

p1
#----------------------------------------------------------
#    This is the new ggplot box plot line that worked:
#----------------------------------------------------------

bp = ggplot(zSepalFrame, aes(x=factor(zSepalWdth), y=zSepalLength, color = zSepalWdth)) + geom_boxplot() + theme(legend.position = "none")
bp

This is what the ggplot box plot looked like

我没有你的精确数据集,OP,但它似乎源于为你的 x 轴分配一个连续变量,而箱线图需要一个离散变量。

A continuous 变量类似于数据框中的数字列。所以像这样:

x <- c(4,4,4,8,8,8,8)

虽然变量x只包含4和8,但R将其指定为数字类型的变量,它是连续的。这意味着如果您将其绘制在 x 轴上,ggplot 将不会出现落在 4 或 8 之间的任何位置的问题,并且会相应地定位。

另一种类型的变量称为离散,它是这样的:

y <- c("Green", "Green", "Flags", "Flags", "Cars")

变量y只包含字符。它 必须 是离散的,因为 "Green""Cars" 之间没有这样的东西。如果绘制在 x 轴上,ggplot 会将事物分组为 "Green""Flags""Cars".

很酷的是,您可以将 连续 变量更改为 离散 变量。一种方法是分解或强制 R 将变量视为一个因素。如果你输入 factor(x),你会得到这个:

[1] 4 4 4 8 8 8 8
Levels: 4 8

x 中的值是相同的,但是当 x 是一个因子时,现在没有 4 到 8 之间的数字 - 它只会增加另一个级别。

简而言之,这就是您的箱线图发生变化的原因。让我们用 iris 数据集进行演示。首先,像你这样的例子。请注意,我正在分配 x=Sepal.Length。在 iris 数据集中,Sepal.Length 是数值,所以 continuous.

ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
  geom_boxplot()

这与你的相似。原因是箱线图是根据x分组,然后计算这些组的统计量绘制的。如果变量是连续的,则没有“组”,即使数据被复制(如上面的x)。分组的一种方法是强制数据离散,如 factor(Sepal.Length)。这是你这样做时的样子:

ggplot(iris, aes(x=factor(Sepal.Length), y=Sepal.Width)) +
  geom_boxplot()

获得相同效果的另一种方法是使用 group= 美学,它会按照您的想法进行操作:根据数据集中的该列进行分组。

ggplot(iris, aes(x=Sepal.Length), y=Sepal.Width, group=Sepal.Length)) +
  geom_boxplot()