2014-09-21 36 views
3

我一直在学习Gnuplot大约一天,并且我想使用boxplot从数据集一览中发现异常值。从Gnuplot中的boxplot标签异常

因此,让我们说我进行实验:

  • 在10个科目
  • 我做10个课题重复任务的100倍,达到3个具体目标。
  • 我收集他们达到目标1,目标2,目标3的次数。

这些结果都聚集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)的单词对应,它们属于''。

然后,当我打开boxplot我可以识别一目了然不仅有异常值,但他们是谁

有谁知道如何做到这一点?我看了论坛,看到一些人在R这样做,但不是在Gnuplot。

+0

不,你不能自动标注的异常值。统计计算是在内部完成的,您不能将标签附加到任何结果。你只能在以后,如果你知道的值,使用'标签'绘图风格的一些标签。 – Christoph 2014-09-21 18:20:28

+0

谢谢。我将在R中寻找解决方案。 – Robin74 2014-09-22 01:13:58

+1

@Christoph万一你有兴趣,我已经发布了一个解决方案。 – 2014-09-22 19:25:52

回答

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