GGPubr 与 R-Boxplot 显示不同的极值
GGPubr vs. R-Boxplot shows different extreme values
我使用常规的“箱线图”函数来检查我的数据中的极值。对于项目中的演示文稿,我随后使用包 ggpubr(基于 ggplot2)创建了相同的箱线图。
据我所知,胡须在两个印迹中应该代表相同的区域。令我惊讶的是,在 ggpubr 箱线图中出现了一个极值,而在 r-箱线图中没有显示。
Screenshot ggpubr boxplot
Screenshot r-boxplot
代码 R-Boxplot:
boxplot(data$vtrust_post1, data$vtrust_post2)
代码 Ggpubr:
vtrust_a_b_long %>%
ggboxplot(x = "drive", y = "count", bxp.errorbar = TRUE)
对于 ggpubr,我必须将数据转换为长格式:
vtrust_a_b <- data.frame("subject_no" = data$id, "a" = data$vtrust_post1, "b" = data$vtrust_post2)
vtrust_a_b_long <- vtrust_a_b %>%
gather(key = "drive", value = "count", a, b)
我是不是做错了什么?两个数据都包含相同的最大值。可能是 r-boxplot 和 ggpubr/ggplot2?
中的极值定义不同
非常感谢您的帮助!
更新:重现问题的代码
使用此代码表示仅适用于 ggpubr 版本的极值。
a <- c(1.50, 3.50, 1.50, 3.00, 1.25, 5.25, 2.50, 2.50, 1.50, 2.25, 1.75, 2.25, 2.25, 2.25, 4.50, 2.25, 3.25, 1.25, 2.50, 2.75, 1.75, 4.25, 2.75, 2.00,
1.75, 3.50, 3.25, 3.00, 1.25, 1.25, 3.75, 1.50, 1.75, 2.25, 1.25, 2.00, 1.50, 3.50, 1.75, 3.25)
boxplot(a)
ggpubr::ggboxplot(a)
更新 2
由于提示,它可能是由 R 中的本地设置引起的,我尝试了 https://rdrr.io/snippets/ 处的代码。同样,出现差异:
Screenshot comparison r-base boxplot and ggpubr boxplot.
查看 base R graphics::boxplot
的源代码,第 48 行显示胡须是由 grDevices::boxplot.stats
计算的。查看 boxplot.stats
的源代码(通过在提示符下键入)显示它使用 stats::fivenum
来计算绘制胡须的距离。
fivenum(a)
#[1] 1.250 1.625 2.250 3.125 5.250
graphics::boxplot
源代码的第 156 和 157 行显示胡须从第二个值延伸到第一个值,然后从第四个值延伸到第五个值。
相比之下,查看 geom_boxplot
的来源告诉我们晶须延伸到 最近的数据点 不超过铰链 IQR 的 1.5 倍.这是通过 stats::quantile
:
计算的
quantile(a,0.75) + diff(quantile(a,c(0, 0.25, 0.5, 0.75, 1))[c(2,4)])*1.5
#5.125
由于a
的第6个元素是5.25
,它比5.125
多,因此,晶须没有延伸到那个点。
我使用常规的“箱线图”函数来检查我的数据中的极值。对于项目中的演示文稿,我随后使用包 ggpubr(基于 ggplot2)创建了相同的箱线图。
据我所知,胡须在两个印迹中应该代表相同的区域。令我惊讶的是,在 ggpubr 箱线图中出现了一个极值,而在 r-箱线图中没有显示。
Screenshot ggpubr boxplot
Screenshot r-boxplot
代码 R-Boxplot:
boxplot(data$vtrust_post1, data$vtrust_post2)
代码 Ggpubr:
vtrust_a_b_long %>%
ggboxplot(x = "drive", y = "count", bxp.errorbar = TRUE)
对于 ggpubr,我必须将数据转换为长格式:
vtrust_a_b <- data.frame("subject_no" = data$id, "a" = data$vtrust_post1, "b" = data$vtrust_post2)
vtrust_a_b_long <- vtrust_a_b %>%
gather(key = "drive", value = "count", a, b)
我是不是做错了什么?两个数据都包含相同的最大值。可能是 r-boxplot 和 ggpubr/ggplot2?
中的极值定义不同非常感谢您的帮助!
更新:重现问题的代码
使用此代码表示仅适用于 ggpubr 版本的极值。
a <- c(1.50, 3.50, 1.50, 3.00, 1.25, 5.25, 2.50, 2.50, 1.50, 2.25, 1.75, 2.25, 2.25, 2.25, 4.50, 2.25, 3.25, 1.25, 2.50, 2.75, 1.75, 4.25, 2.75, 2.00,
1.75, 3.50, 3.25, 3.00, 1.25, 1.25, 3.75, 1.50, 1.75, 2.25, 1.25, 2.00, 1.50, 3.50, 1.75, 3.25)
boxplot(a)
ggpubr::ggboxplot(a)
更新 2 由于提示,它可能是由 R 中的本地设置引起的,我尝试了 https://rdrr.io/snippets/ 处的代码。同样,出现差异:
Screenshot comparison r-base boxplot and ggpubr boxplot.
查看 base R graphics::boxplot
的源代码,第 48 行显示胡须是由 grDevices::boxplot.stats
计算的。查看 boxplot.stats
的源代码(通过在提示符下键入)显示它使用 stats::fivenum
来计算绘制胡须的距离。
fivenum(a)
#[1] 1.250 1.625 2.250 3.125 5.250
graphics::boxplot
源代码的第 156 和 157 行显示胡须从第二个值延伸到第一个值,然后从第四个值延伸到第五个值。
相比之下,查看 geom_boxplot
的来源告诉我们晶须延伸到 最近的数据点 不超过铰链 IQR 的 1.5 倍.这是通过 stats::quantile
:
quantile(a,0.75) + diff(quantile(a,c(0, 0.25, 0.5, 0.75, 1))[c(2,4)])*1.5
#5.125
由于a
的第6个元素是5.25
,它比5.125
多,因此,晶须没有延伸到那个点。