Gnuplot v5.4.2箱线图异常点同X轴位置绘制方法问询
在Gnuplot v5.4.2中统一箱线图异常点的X位置
Gnuplot默认箱线图的异常点会随机分散在箱线的X宽度范围内,没有直接提供"X宽度为0"的点类型,但可以通过两步绘图法实现异常点对齐到箱线正上方/下方的需求,同时完全保留箱线的统计属性:
核心实现思路
- 先绘制箱线图,用
nooutliers隐藏默认分散的异常点(注意:该选项仅隐藏显示,不会影响箱线的四分位数、均值等统计计算,因为统计逻辑在绘图前已完成) - 利用Gnuplot内置的
stats命令提取每组数据的异常点,将这些点的X坐标统一设置为对应箱线的中心位置,再单独叠加绘制
完整脚本示例
假设你的数据文件为data.txt,每列对应一组数据,以下是可直接运行的代码:
set terminal pngcairo enhanced font 'Arial,10' set output 'aligned_outliers_boxplot.png' # 基础样式设置 set style boxplot nooutliers # 隐藏默认分散的异常点,不影响统计 set style data boxplot set boxwidth 0.8 set xtics 1,1,3 # 根据你的数据组数调整范围 set ylabel 'Measurement Value' set xlabel 'Group' # 第一步:绘制箱线图主体 plot 'data.txt' using 1:2:3 with boxplot title 'Boxplot' # 第二步:提取并绘制对齐的异常点 stats 'data.txt' using 1:2:3 # 统计所有组的异常点信息 do for [i=1:3] { # 循环处理每组数据,3为总组数 # 将异常点的X坐标固定为组序号i,用红色实心点绘制 plot 'data.txt' using (i):i every ::STATS_boxplot_outliers_start[i]::STATS_boxplot_outliers_end[i] \ with points pt 7 lc rgb 'red' notitle }
其中STATS_boxplot_outliers_start[i]和STATS_boxplot_outliers_end[i]是Gnuplot统计后自动生成的变量,对应第i组异常点在数据文件中的行范围。
替代简化方案:预处理数据
如果觉得循环统计的方式繁琐,可以用awk等工具提前预处理数据,提取每组异常点并统一X坐标后保存到新文件,再用Gnuplot叠加绘制:
# preprocess_outliers.awk BEGIN { FS=" " } { for (col=1; col<=NF; col++) { # 直接输出组序号(X值)和对应数据点,后续用Gnuplot结合stats筛选异常点 print col, $col >> "aligned_outliers.txt" } }
执行awk -f preprocess_outliers.awk data.txt生成对齐后的异常点文件,再在Gnuplot中先绘制箱线图,再绘制该文件的异常点(需结合stats结果筛选)。
GNU R替代方案
如果Gnuplot的实现仍显复杂,R的ggplot2可以一键实现异常点对齐:
library(ggplot2) library(tidyr) # 读取并转换数据格式 data <- read.table("data.txt", header = FALSE) data_long <- pivot_longer(data, cols = everything(), names_to = "Group", values_to = "Value") # 绘制对齐异常点的箱线图 ggplot(data_long, aes(x = Group, y = Value)) + geom_boxplot(outlier.alpha = 1, outlier.shape = 19) # outlier自动对齐箱线中心
内容的提问来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

