从Gnuplot中的箱线图标记异常值

时间:2014-09-21 18:03:53

标签: gnuplot

我一直在学习Gnuplot大约一天,我想使用boxplot来查看数据集中的异常值。

所以,让我们说我正在进行一项实验:

  • 关于10个科目
  • 我让10名受试者重复任务100次,达到3个特定目标。
  • 我收集他们到达Target1,Target2,Target3的次数。

这些结果收集在下面描述的文件data_File_new.dat中:

    Name    Target1   Target2   Target3
    subject1    10  30  50
    subject2    11  31  51
    subject3    9   29  49
    subject4    12  32  52
    subject5    8   28  48
    subject6    13  33  53
    subject7    7   27  47
    subject8    50  34  54
    subject9    6   50  46
    subject10 15    35  20  

现在我从这个数据

创建一个箱形图
   file = 'data_File_new.dat'
   header = system('head -1 '.file);
   N=words(header)
   set title 'BoxPlot Subject Success'
   set ylabel 'Number Of Success'
   set xtics border in scale 0,0 nomirror norotate  offset character 0, 0, 0 autojustify
   set xtics norangelimit
   set xtics rotate -45
   set xtics ('' 2)
   set for [i=2:N] xtics add (word(header, i) i)
   set style data boxplot
   plot for [i=2:N] file using (i):i

所以结果是一个箱线图,异常值被绘制为实心点(我想发布图片,但我需要10个声望来发布图像)。它告诉我是否有异常值。 但是我想知道更多我想知道谁是异常值,即:

  • 主题8是目标1的异常值
  • 主题9是目标2的异常值
  • 主题10是目标3的异常值

由于Gnuplot 知道这些点是异常值,我希望Gnuplot将它们存储在某种列表中。我想告诉Gnuplot '绘制异常值并用第一列(subjectx)的单词标记它们对应于它们所属的行

然后,当我打开箱图时,我可以一目了然不仅有异常值,还有他们

有谁知道怎么做?我在论坛上看到了一些人在R中这样做,但没有在Gnuplot中这样做。

1 个答案:

答案 0 :(得分:2)

这不是gnuplot代码中最漂亮的一点,但它可以完成!

Gnuplot stats可用于获取上四分位数和下四分位数,用于生成箱线图。然后,您可以使用一些条件代码绘制范围with labels之外的点。棘手的部分是plot命令在最后eval之前构建为字符串。就像我说的,不太漂亮!

file = 'data_File_new.dat'
header = system('head -1 '.file)
N=words(header)
set title 'BoxPlot Subject Success'
set ylabel 'Number Of Success'
set xtics border in scale 0,0 nomirror norotate  offset character 0, 0, 0 autojustify
set xtics norangelimit
set xtics rotate -45
set xtics ('' 2)
set for [i=2:N] xtics add (word(header, i) i)
r = 1.5
set style boxplot range r
unset key
cmd = "plot for [i=2:N] file using (i):i with boxplot"
do for [i=2:N] {
    stats file using i every ::1 nooutput
    lq = STATS_lo_quartile
    uq = STATS_up_quartile
    ir = uq - lq
    min = lq - r * ir
    max = uq + r * ir
    cmd = cmd . sprintf(", file using (%d):($%d < %d || $%d > %d ? $%d : 1/0):1 every ::1 with labels offset 5,0", i, i, min, i, max, i)
}
eval cmd

final plot with labeled outliers