pgfplots:分组堆叠条形图

pgfplots:分组堆叠条形图

我正在尝试使用 创建 5 个堆叠 xbars 的组y expr={\thisrow{y} - (mod(\thisrow{y},5)/2)}。但是,在创建一些组之后,计算似乎出错了,第三组实际上由 6 个条形组成:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{%
x y
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
}\loadedtable

    \begin{figure}[h]
        \begin{tikzpicture}
            \begin{axis}[xbar stacked, ytick=data, y=0.9cm]
                \addplot table[x=x,y expr={\thisrow{y} - (mod(\thisrow{y},5)/2)}] \loadedtable ;
                \addplot table[x=x,y expr={\thisrow{y} - (mod(\thisrow{y},5)/2)}] \loadedtable ;
            \end{axis}
        \end{tikzpicture}
    \end{figure}
\end{document}

在此处输入图片描述

答案1

发生这种情况是因为mod使用库时函数的数值不准确fpu(这是环境中大多数计算的情况axis)。有时,函数会错误地返回除数而不是零(\pgfmathparse{mod(15,5)}例如)。

mod您可以通过定义检查此错误的函数的新版本来修复此问题:

\pgfmathdeclarefunction{fpumod}{2}{%
    \pgfmathfloatdivide{#1}{#2}%
    \pgfmathfloatint{\pgfmathresult}%
    \pgfmathfloatmultiply{\pgfmathresult}{#2}%
    \pgfmathfloatsubtract{#1}{\pgfmathresult}%
    \pgfmathfloatifapproxequalrel{\pgfmathresult}{#2}{\def\pgfmathresult{0}}{}%
}

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usepackage{pgfplotstable}

\pgfmathdeclarefunction{fpumod}{2}{%
    \pgfmathfloatdivide{#1}{#2}%
    \pgfmathfloatint{\pgfmathresult}%
    \pgfmathfloatmultiply{\pgfmathresult}{#2}%
    \pgfmathfloatsubtract{#1}{\pgfmathresult}%
    \pgfmathfloatifapproxequalrel{\pgfmathresult}{#2}{\def\pgfmathresult{0}}{}%
}

\begin{document}
\pgfplotstableread{%
x y
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
}\loadedtable

        \begin{tikzpicture}
            \begin{axis}[xbar stacked, ytick=data, y=0.9cm]
                \addplot table[x=x,y expr={\thisrow{y} - (fpumod(\thisrow{y},5)/2)}] \loadedtable ;
                \addplot table[x=x,y expr={\thisrow{y} - (fpumod(\thisrow{y},5)/2)}] \loadedtable ;
            \end{axis}
        \end{tikzpicture}
\end{document}

相关内容