我正在尝试使用 创建 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}