【问题标题】:Label Outliers from a boxplot in Gnuplot从 Gnuplot 中的箱线图中标记异常值
【发布时间】:2014-09-21 18:03:53
【问题描述】:

我已经学习 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 中却没有。

【问题讨论】:

  • 不,您不能自动标记这些异常值。统计计算在内部完成,您不能将标签“附加”到任何结果。如果您知道这些值,则只能稍后使用 labels 绘图样式进行一些标签。
  • 谢谢。我将在 R 中寻找解决方案。
  • @Christoph 如果您有兴趣,我已经发布了解决方案。
  • 它有效。非常感谢您的专业知识,Tom,非常有帮助。

标签: gnuplot


【解决方案1】:

这不是最漂亮的 gnuplot 代码,但可以做到!

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

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

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2020-08-27
    • 2013-07-17
    • 1970-01-01
    • 2013-02-17
    • 2015-06-05
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多