我正在尝试创建一个类似于我在 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 中创建的图形图像如下图所示:
虽然我使用 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}
上述代码编译结果如下图所示
我的问题是,为什么 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}