如何在 gnuplot 中对箱线图异常值进行分组
How to group boxplot outliers in gnuplot
我有大量数据点。我尝试用箱线图绘制它们,但一些离群值是完全相同的值,并且它们在彼此旁边的一条线上表示。我找到了 How to set the horizontal distance between outliers in gnuplot boxplot,但它并没有多大帮助,因为这显然是不可能的。
是否可以将离群值归为一组,打印一个点,然后在旁边的括号中打印一个数字,表示有多少个点?我认为这会使它在图表中更具可读性。
作为参考,我有三个箱线图表示一个 x 值,在一张图中乘以六。我正在使用 gnuplot 5 并且已经使用了 pointsize,它不再减少距离。
希望对您有所帮助!
编辑:
set terminal pdf
set output 'dat.pdf'
file0 = 'dat1.dat'
file1 = 'dat2.dat'
file2 = 'dat3.dat'
set pointsize 0.2
set notitle
set xlabel 'X'
set ylabel 'Y'
header = system('head -1 '.file0);
N = words(header)
set xtics ('' 1)
set for [i=1:N] xtics add (word(header, i) i)
set style data boxplot
plot file0 using (1-0.25):1:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 title 'A'
plot file1 using (1):1:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 title 'B'
plot file2 using (1+0.25):1:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 title 'C'
for [i=2:N] plot file0 using (i-0.25):i:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 notitle
for [i=2:N] plot file1 using (i):i:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 notitle
for [i=2:N] plot file2 using (i+0.25):i:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 notitle
使用此代码实现它的最佳方法是什么?
没有自动完成此操作的选项。在 gnuplot 中手动执行此操作所需的步骤是:
(在下文中,我假设数据文件 data.dat
只有一列。)
使用 stats
分析您的数据以确定异常值的边界:
stats 'data.dat' using 1
range = 1.5 # (this is the default value of the `set style boxplot range` value)
lower_limit = STATS_lo_quartile - range*(STATS_up_quartile - STATS_lo_quartile)
upper_limit = STATS_up_quartile + range*(STATS_up_quartile - STATS_lo_quartile)
只计算异常值并将它们写入临时文件
set table 'tmp.dat'
plot 'data.dat' using 1:( > upper_limit || < lower_limit ? 1 : 0) smooth frequency
unset table
绘制不含离群值的箱线图,以及具有 labels
绘图样式的离群值:
set style boxplot nooutliers
plot 'data.dat' using (1):1 with boxplot,\
'tmp.dat' using (1):( > 0 ? : 1/0):(sprintf('(%d)', int())) with labels offset 1,0 left point pt 7
每个箱线图都需要这样做。
免责声明:这个程序基本上应该可以工作,但是没有示例数据我无法测试它。
我有大量数据点。我尝试用箱线图绘制它们,但一些离群值是完全相同的值,并且它们在彼此旁边的一条线上表示。我找到了 How to set the horizontal distance between outliers in gnuplot boxplot,但它并没有多大帮助,因为这显然是不可能的。
是否可以将离群值归为一组,打印一个点,然后在旁边的括号中打印一个数字,表示有多少个点?我认为这会使它在图表中更具可读性。
作为参考,我有三个箱线图表示一个 x 值,在一张图中乘以六。我正在使用 gnuplot 5 并且已经使用了 pointsize,它不再减少距离。 希望对您有所帮助!
编辑:
set terminal pdf
set output 'dat.pdf'
file0 = 'dat1.dat'
file1 = 'dat2.dat'
file2 = 'dat3.dat'
set pointsize 0.2
set notitle
set xlabel 'X'
set ylabel 'Y'
header = system('head -1 '.file0);
N = words(header)
set xtics ('' 1)
set for [i=1:N] xtics add (word(header, i) i)
set style data boxplot
plot file0 using (1-0.25):1:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 title 'A'
plot file1 using (1):1:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 title 'B'
plot file2 using (1+0.25):1:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 title 'C'
for [i=2:N] plot file0 using (i-0.25):i:(0.2) with boxplot lw 2 lc rgb '#8B0000' fs pattern 16 notitle
for [i=2:N] plot file1 using (i):i:(0.2) with boxplot lw 2 lc rgb '#00008B' fs pattern 4 notitle
for [i=2:N] plot file2 using (i+0.25):i:(0.2) with boxplot lw 2 lc rgb '#006400' fs pattern 5 notitle
使用此代码实现它的最佳方法是什么?
没有自动完成此操作的选项。在 gnuplot 中手动执行此操作所需的步骤是:
(在下文中,我假设数据文件 data.dat
只有一列。)
使用
stats
分析您的数据以确定异常值的边界:stats 'data.dat' using 1 range = 1.5 # (this is the default value of the `set style boxplot range` value) lower_limit = STATS_lo_quartile - range*(STATS_up_quartile - STATS_lo_quartile) upper_limit = STATS_up_quartile + range*(STATS_up_quartile - STATS_lo_quartile)
只计算异常值并将它们写入临时文件
set table 'tmp.dat' plot 'data.dat' using 1:( > upper_limit || < lower_limit ? 1 : 0) smooth frequency unset table
绘制不含离群值的箱线图,以及具有
labels
绘图样式的离群值:set style boxplot nooutliers plot 'data.dat' using (1):1 with boxplot,\ 'tmp.dat' using (1):( > 0 ? : 1/0):(sprintf('(%d)', int())) with labels offset 1,0 left point pt 7
每个箱线图都需要这样做。
免责声明:这个程序基本上应该可以工作,但是没有示例数据我无法测试它。