当我用 绘制直方图时,我遇到了一些问题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 添加到未转换的值中。