TikZ:直方图中的箱体显示不正确

TikZ:直方图中的箱体显示不正确

我正在尝试创建一个类似于我在 MATLAB 中制作的 tikzpicture。运行直方图后,MATLAB 给出了以下结果:

myhistnorm = [ 0.1231   0   0   0   0   0   0   0.0001  0.0001  0.0004  0.001   0.0048  0.0313  0.1562  0.3464  0.2684  0.0645  0.0036  0 ]

我使用了以下垃圾箱:

mybin = [ 1e-15 1e-14 1e-13 1e-12 1e-11 1e-10 1e-9 1e-8 1e-7 1e-6 1e-5 1e-4 1e-3 1e-2 1e-1 1e+0 1e+1 1e+2 1e+3 ]

在 MATLAB 中创建的图形图像如下图所示:在 MATLAB 中创建的非归一化直方图

虽然我使用 TikZ 创建了标准化直方图,但它在其他方面与 MATLAB 创建的非标准化图形有所不同。

\begin{tikzpicture}
\begin{axis}[
    width=\figurewidth,
    height=\figureheight,
    axis on top,
    scale only axis,
    xmode=log,
    ymode=log,
    ybar interval,
    x tick label as interval=false,
    xlabel = {$\boldsymbol{\nabla}\cdot{\bf u}_{int}$},
    xtick={},
    xtickten={-16,-14,-12,...,4},
    yticklabel={},
    xmin=1e-16, xmax=1e+4,
    ymax=1,
    grid=none,
    ymajorgrids,
]
\addplot [fill=gray!50] table [x=Lower, y=Count] {
Lower Upper Count
9.9e-15 1e-14    0.1231
1e-14 1e-13      0.0000
1e-13 1e-12      0.0000
1e-12 1e-11      0.0000
1e-11 1e-10      0.0000
1e-10 1e-9       0.0000
1e-9  1e-8       0.0000
1e-8  1e-7       0.0001
1e-7  1e-6       0.0001
1e-6  1e-5       0.0004
1e-5  1e-4       0.0010
1e-4  1e-3       0.0048
1e-3  1e-2       0.0313
1e-2  1e-1       0.1562
1e-1  1e+0       0.3464
1e+0  1e+1       0.2684
1e+1  1e+2       0.0645
1e+2  1e+3       0.0036
1e+3  1e+10      0.0000
};
\end{axis}
\end{tikzpicture}    

上述代码编译结果如下图所示TikZ 创建的归一化直方图

我的问题是,为什么 1e-14 到 1e-8 之间的 bin 显示与我在代码中输入的表格不同?它们应该全部为零,只有第一个 bin 应该有 0.1231 个计数。此外,图中还缺少 bin (1e+2)-(1e+3)。

谢谢。

答案1

问题在于,在对数上下文中无法正确处理零值。PGFPlots 会将计数为零的条目从列表中过滤掉,然后继续处理,就好像它们从未出现过一样,导致第一个条形图较宽。

为了解决这个问题,您可以手动指定最小 y 值,并为计数为零的条形分配一个低于最小值的值。这样,第一个条形的宽度将正确计算,但零条形不会显示在图中。这种行为并不完全直观,因此您可能需要考虑发布功能要求处理具有零值的数据点,即使在对数环境中也可用于确定区间图的条形宽度。

\documentclass[border=5mm]{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.7}


\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis on top,
    scale only axis,
    xmode=log,
    ymode=log,
    ybar interval,
    x tick label as interval=false,
    xtick={},
    xtickten={-16,-14,-12,...,4},
    yticklabel={},
    xmin=1e-16, xmax=1e+4,
    ymin=1e-5,ymax=1,
    grid=none,
    ymajorgrids,
    log origin=infty
]
\addplot [fill=gray!50] table [x=Lower, y=Count] {
Lower Upper Count
9.9e-15 1e-14    0.1231
1e-14 1e-13      1e-6
1e-13 1e-12      0.0000
1e-9  1e-8       0.0000
1e-8  1e-7       0.0001
1e-7  1e-6       0.0001
1e-6  1e-5       0.0004
1e-5  1e-4       0.0010
1e-4  1e-3       0.0048
1e-3  1e-2       0.0313
1e-2  1e-1       0.1562
1e-1  1e+0       0.3464
1e+0  1e+1       0.2684
1e+1  1e+2       0.0645
1e+2  1e+3       0.0036
1e+3  1e+10      0.0000
};
\end{axis}
\end{tikzpicture}   
\end{document}

相关内容