在R中按数值范围而非类别绘制多箱线图的实现方法
问题描述
我希望在R中绘制多箱线图,而非以x轴类别定义每个箱线图,而是用水深数值范围(0至0.6m间的20个区间)来划分。x轴展示水深区间,y轴为电导率。我已通过以下代码生成分位数断点:
x=dataset$Depth ncells=20 breaks=quantile(x, seq, (0,1,by=1/ncells)) table(cut(x, breaks=breaks))
输出的区间频数如下:
(0.155,0.158] (0.158,0.162] (0.162,0.166] (0.166,0.168] (0.168,0.17] 1116 1116 1116 1116 1116 (0.17,0.171] (0.171,0.173] (0.173,0.174] (0.174,0.175] (0.175,0.176] 1116 1117 1116 1116 1116 (0.176,0.177] (0.177,0.179] (0.179,0.185] (0.185,0.187] (0.187,0.189] 1116 1116 1116 1117 1116 (0.189,0.191] (0.191,0.194] (0.194,0.206] (0.206,0.244] (0.244,0.592] 1116 1116 1116 1116 1117
我希望用这些区间定义每个箱线图的数据范围,请问是否需要将其标记为数据集的离散类别(如flow1、flow2等),还是可直接使用这些范围?优先使用ggplot2绘制,恳请解答。
解答
不需要手动将区间命名为flow1、flow2这类自定义标签,直接用cut()生成的区间类别即可,ggplot2可以直接识别这个离散型变量作为x轴分组。
步骤1:修正断点生成代码并添加区间列
你之前的quantile函数语法有误,seq的调用格式不对,正确写法是seq(0,1,by=1/ncells)。同时建议添加include.lowest=TRUE参数,确保最小的水深值能被分到第一个区间里:
library(ggplot2) # 生成正确的分位数断点并添加区间列 dataset$depth_bin <- cut( dataset$Depth, breaks = quantile(dataset$Depth, seq(0, 1, by = 1/20)), include.lowest = TRUE )
步骤2:用ggplot2绘制箱线图
直接以depth_bin作为x轴变量,电导率作为y轴变量即可:
ggplot(dataset, aes(x = depth_bin, y = 电导率列名)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + labs( x = "水深区间(m)", y = "电导率", title = "各水深区间电导率分布箱线图" ) + theme_minimal() + # 旋转x轴标签避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
额外优化(可选)
如果觉得区间标签太长,可以用labels参数自定义更简洁的标签,比如保留两位小数:
breaks <- quantile(dataset$Depth, seq(0, 1, by = 1/20)) # 生成简洁标签,格式为"起始值-结束值" labels <- paste0(round(breaks[-length(breaks)], 2), "-", round(breaks[-1], 2)) dataset$depth_bin <- cut( dataset$Depth, breaks = breaks, include.lowest = TRUE, labels = labels )
再用这个自定义标签的depth_bin绘图,x轴会更清爽。
内容的提问来源于stack exchange,提问作者Elle
相关产品推荐
相关产品推荐

