Octave 如何处理此倍频程箱线图中的异常值以提高可读性

Octave 如何处理此倍频程箱线图中的异常值以提高可读性,octave,boxplot,readability,outliers,Octave,Boxplot,Readability,Outliers,1,5-3倍分位数间范围的异常值用+标记,高于3倍IQR的异常值用o标记。但由于数据集包含多个异常值,下面的箱线图很难读取,因为+和o符号相互重叠,形成了一条粗红线 我需要绘制所有数据,因此删除它们不是一个选项,但我可以显示更长的框,即拉伸q1和q4以达到真正的最小/最大值,并跳过+和o异常值符号。如果只显示最小和最大异常值,我也会很好 我在这里完全不知道,发现的倍频程箱线图文档中没有任何关于如何处理异常值的有用示例。在stackoverflow的搜索也没有让我更接近解决方案。因此,任何帮助或指

1,5-3倍分位数间范围的异常值用+标记,高于3倍IQR的异常值用o标记。但由于数据集包含多个异常值,下面的箱线图很难读取,因为+和o符号相互重叠,形成了一条粗红线

我需要绘制所有数据,因此删除它们不是一个选项,但我可以显示更长的框,即拉伸q1和q4以达到真正的最小/最大值,并跳过+和o异常值符号。如果只显示最小和最大异常值,我也会很好

我在这里完全不知道,发现的倍频程箱线图文档中没有任何关于如何处理异常值的有用示例。在stackoverflow的搜索也没有让我更接近解决方案。因此,任何帮助或指导都是非常感谢的

我如何修改下面的代码,基于可读的相同数据集创建箱线图,即不将异常值绘制在彼此的顶部,从而创建一条粗红线

我在Windows10机器上使用Octave 4.2.1 64位,qt作为图形工具,GDAL_TRANSLATE从Octave中调用以处理tif文件

不能将graphics_toolkit切换到gnuplot等,因为我无法旋转打印水平框而不是垂直框。在.pdf文件中,结果必须有效果,而不仅仅是在倍频程查看器中

请原谅我完全是新手风格的编码工作,以获得适当的高分辨率pdf导出:


我只想删除异常值。这很容易,因为句柄是返回的。我还提供了一些缓存算法,这样,如果您正在玩绘图,就不必重新加载所有TIF。在不同的脚本中拆分转换、处理和打印始终是一个好主意,但对于stackoverflow来说,这不是一个好主意,因为在stackoverflow中,最简单的示例是首选的。我们开始:

pkg load statistics

cache_fn = "input.raw";

# only process tif if not already done
if (! exist (cache_fn, "file"))
  fns = glob ("*.tif");
  for k=1:numel (fns)

    ofn = tmpnam;
    cmd = sprintf ('gdal_translate -of aaigrid "%s" "%s"', fns{k}, ofn);
    printf ("calling '%s'...\n", cmd);
    fflush (stdout);
    [s, out] = system (cmd);
    if (s != 0)
      error ('calling gdal_translate failed with "%s"', out);
    endif
    fid = fopen (ofn, "r");
    # read 6 headerlines
    hdr = [];
    for i=1:6
      s = strsplit (fgetl (fid), " ");
      hdr.(s{1}) = str2double (s{2});
    endfor
    d = dlmread (fid);

    # check size against header
    assert (size (d), [hdr.nrows hdr.ncols])

    # set nodata to NA
    d (d == hdr.NODATA_value) = NA;

    raw{k} = d;

    # create copy with existing values
    raw_v{k} = d(! isna (d));

    fclose (fid);

  endfor

  # save result
  save (cache_fn, "raw_v", "fns");
else
  load (cache_fn)
endif

## generate plot
[s, h] = boxplot (raw_v);

## in h you'll find now box, whisker, median, outliers and outliers2
## delete them
delete (h.outliers)
delete (h.outliers2)

set (gca, "xtick", 1:numel(fns),
          "xticklabel", strrep (fns, ".tif", ""));
          ylabel ("Plats kvar (meter)");

set (gca, "ytick", 0:50:600);
set (gca, "ygrid", "on");
set (gca, "gridlinestyle", "--");

set (gcf, "paperunit", "centimeters", "papersize", [35, 60], "paperposition", [0 0 60 30], "paperorientation", "landscape")          

zoom (0.95)
view ([90 90])

print ("loudden_box_dotted.pdf", "-F:14")
给予


我记得你在上一个问题中提到过,你不是在使用一个修改过的箱线图吗?所有类型的箱线图都统一使用第一个和第三个四分位作为箱线的起点和终点,第二个四分位数为band/line,因此您不能修改它,仍然称之为boxplot。我使用的是修改后的boxplot.m,但不幸的是,它太多了,并且只在大约一半的时间内工作得太差,因为它更好看。我通过将图像转换成黑白来改变颜色,这样看起来更好一点。但是如何处理这些数据中的异常值以避免粗红线问题呢?即使我像我一样为报告创建了一个带有+和o的图例并给出了解释,你也很难看出这是一个+/o的问题,它只是显示为一条粗红线。你认为有可能只对异常值使用更小的字体吗?这会增加可读性吗?你到底想要什么?例如,您可以更改红色/绿色这两种类型的异常值的颜色,或者删除所有异常值。非常感谢Andy!在处理情节风格时,我一直在想,安迪不必坐着等剧本一遍又一遍地阅读所有的TIF,他会知道一个更好的方法。不知何故,我设法回到了boxplot.m的修改版本,它没有打印异常值并使其正常工作,但现在我可能终于学会了如何自己创建一些boxplot,多亏了您。请记住,还有GNU Octave帮助邮件列表。但您应该提到,您还询问了Stackoverflow,您是否在这两方面都做了,以防止其他人的工作量加倍。IRC上有八度音
pkg load statistics

cache_fn = "input.raw";

# only process tif if not already done
if (! exist (cache_fn, "file"))
  fns = glob ("*.tif");
  for k=1:numel (fns)

    ofn = tmpnam;
    cmd = sprintf ('gdal_translate -of aaigrid "%s" "%s"', fns{k}, ofn);
    printf ("calling '%s'...\n", cmd);
    fflush (stdout);
    [s, out] = system (cmd);
    if (s != 0)
      error ('calling gdal_translate failed with "%s"', out);
    endif
    fid = fopen (ofn, "r");
    # read 6 headerlines
    hdr = [];
    for i=1:6
      s = strsplit (fgetl (fid), " ");
      hdr.(s{1}) = str2double (s{2});
    endfor
    d = dlmread (fid);

    # check size against header
    assert (size (d), [hdr.nrows hdr.ncols])

    # set nodata to NA
    d (d == hdr.NODATA_value) = NA;

    raw{k} = d;

    # create copy with existing values
    raw_v{k} = d(! isna (d));

    fclose (fid);

  endfor

  # save result
  save (cache_fn, "raw_v", "fns");
else
  load (cache_fn)
endif

## generate plot
[s, h] = boxplot (raw_v);

## in h you'll find now box, whisker, median, outliers and outliers2
## delete them
delete (h.outliers)
delete (h.outliers2)

set (gca, "xtick", 1:numel(fns),
          "xticklabel", strrep (fns, ".tif", ""));
          ylabel ("Plats kvar (meter)");

set (gca, "ytick", 0:50:600);
set (gca, "ygrid", "on");
set (gca, "gridlinestyle", "--");

set (gcf, "paperunit", "centimeters", "papersize", [35, 60], "paperposition", [0 0 60 30], "paperorientation", "landscape")          

zoom (0.95)
view ([90 90])

print ("loudden_box_dotted.pdf", "-F:14")