具有零 bin 值的对数 y 尺度

具有零 bin 值的对数 y 尺度

当我用 绘制直方图时,我遇到了一些问题ymode=log。这是 MWE

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      xmode=normal,
      ymode=log,
      log origin=infty]
    % Draw series plot
    \addplot[red,fill=red!70,fill opacity=0.2,const plot] coordinates {
        (2, 20335)
        (2.048, 15937)
        (2.096, 12430)
        (2.144, 9469)
        (2.192, 6848)
        (2.24, 4913)
        (2.288, 3428)
        (2.336, 2276)
        (2.384, 1582)
        (2.432, 884)
        (2.48, 494)
        (2.528, 269)
        (2.576, 134)
        (2.624, 65)
        (2.672, 18)
        (2.72, 1)
        (2.768, 2)
        (2.816, 3)
        (2.864, 0)
        (2.912, 0)
        (2.96, 0)
        (3.008, 0)
        (3.056, 0)
        (3.104, 0)
        (3.152, 0)
        (3.2, 0)
    }
    \closedcycle;
  \end{axis}
\end{tikzpicture}
\end{document}

这给了我这个结果

在此处输入图片描述

由于下一个 bin 值为 0,因此无法以对数刻度“绘制”,因此最后一个 bin 大约为 2.8 跳变。我知道如何通过替换(2.864, 0)为类似 的内容来解决这个问题(2.864, 1e-6)。不过,我想通过例如 epsilon 移位来自动更改直方图中的零值,以避免出现此类问题(我的图是由第三方软件生成的,我想避免编辑生成的 LaTeX 文件)。

到目前为止,我尝试使用技巧,通过编写类似以下内容的方式向每个值y filter/.code添加一个小的 epsilon 值y

\addplot[red,fill=red!70,fill opacity=0.2,const plot, 
         y filter/.code=\pgfmathparse{\pgfmathresult+1e-6}]

但是这会使每个箱子移动 1。

答案1

您的 epsilon 技巧的问题在于,y filter在对数变换域中起作用,这就是为什么您最终会得到一条非常接近的线1e0:它正在执行ln(<y coordinate>) + 1e-6。值为零的坐标被过滤掉,结果是<nothing> + 1e-6,当转换回来时,它非常接近1

如果您可以将数据表格式化为使用“常规”格式(坐标周围没有括号),则可以将\addplot table [y expr=\thisrowno{1}+1e-6] ...epsilon 添加到未转换的值中。

相关内容