有人可以解释为什么我的第一个 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()
所以我的第一个 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()