一、boxplot(箱型图/箱形图)简单介绍
图1 箱型图示意图(源于网络)
下限:最小值(Minimum),数据中的最小值。
下四分位数(Q1):将数据按照大小排序(一般是由小到大排列),然后找到数据中位于25%位置的值,即第一个四分位数。如果数据点个数(n)是奇数,则Q1是排在中间位置的值;如果是偶数,则是中间两个值的平均数。
中位数(Median):数据的中位数,即第50%位置的值。与Q1类似,奇数个数据时是中间位置的值,偶数个数据时是中间两个值的平均数。
上四分位数(Q3):将数据按照大小排序,然后找到数据中位于75%位置的值,即第三个四分位数。同样,如果数据点个数是奇数,则Q3是排在中间位置的值;如果是偶数,则是中间两个值的平均数。
下限:最大值(Maximum),数据中的最大值。
这五个值通常被用来描述数据的中心位置和离散程度,以便绘制箱型图。箱型图的盒子部分就由Q1、中位数和Q3组成,箱型图的横线(whiskers)则延伸到最小值和最大值,或者在数据中没有明显异常值时延伸到1.5倍的四分位距(IQR)外的位置。
补充:
boxplot的最大值计算方法:上四分位数+1.5*四分位距(即上下四分位具体数值的做差)。
例如:Q1=2,Q3=32
则Max=32+1.5*(32-2)=77。
同理最大值就是下四分位数-1.5*四分位距。
二、R语言将4组数据绘制在统一箱型图上 代码:
# 加载所需的包
library(ggplot2)
# 创建数据框
data <- data.frame(values = c(values1, values2, values3, values4),
group = rep(c("XXX", "XXX", "XXX", "XXX"), #根据需求设置
sapply(all_values, length)))
# 重新排序group因子
data$group <- factor(data$group, levels = c("XXX", "XXX", "XXX", "XXX"))
#如果R语言绘制的结果和values1234顺序有变化,可以用这个代码
# 自定义函数计算分位数
quantile_fun <- function(x) {
quantiles <- quantile(x, probs = c(0.1, 0.2, 0.3, 0.7, 0.8, 0.9))
data.frame(y = quantiles, ymin = quantiles, ymax = quantiles)
}#因为自身研究需要设置的,可以更改
ggplot(data, aes(x = group, y = values)) +
coord_cartesian(ylim = c(-100, 100))+#设置y轴范围
scale_y_continuous(breaks = seq(-100, 100, by = 10))+#设置y轴的刻度间隔
stat_boxplot(geom = "errorbar",
width = 0.1,
size = 0.5,
position = position_dodge(0.6),
color = "black") +
geom_boxplot(aes(fill = group),
color = "black",
size = 0.5,
width = 0.3,
outlier.fill = "black",
outlier.shape = 19,
outlier.size = 0.1,
outlier.alpha = 0.1,
notch = FALSE) +
stat_summary(fun.data = quantile_fun, geom = "errorbar", width = 0.5, aes(color = group))+#加需要的分位数短线
stat_summary(fun.y = mean, geom = "point", shape = 19, size = 3, color = "blue")+#加均值点
labs(title = "", x = "", y = "")+ #根据需要设置图名、x\y轴名
geom_hline(yintercept = 0, linetype = "dashed", color = "red")+#在y轴0刻线加了一条辅助线
theme(
axis.title = element_text(size = 18),
axis.text = element_text(size = 14),
axis.line = element_line(linewidth = 1, color = "black"),
axis.ticks.length = unit(-0.2, "cm"), # 将刻度线向内移动
panel.border = element_rect(color = "black", fill = NA, linewidth = 1),
panel.background = element_rect(fill = NA)
)
这是结果图,隐私需要打马赛克了。
注意ggplot(data, aes(x = group, y = values)) +中这个"+",很多时候运行不出结果是调整程序的时候忘记"+"了。