我使用了该包pgf-派生成饼图。选项sum=auto
自动计算所有值的总和。以下 MWE 给出Dimension too large
因为这个原因。
\documentclass{standalone}
\usepackage{pgf-pie}
\begin{document}
\begin{tikzpicture}
\pie[sum=auto]{16384/foo}
\end{tikzpicture}
\end{document}
我天真地尝试使用浮点运算单元在以下代码片段中pgf-pie.sty
:
% handle sum
\ifthenelse{\equal{\pgfpie@sum}{auto}}
{
% sum all input
\xdef\pgfpie@sum{0}
\foreach \p/\t in {#2}
{
\pgfmathparse{\pgfpie@sum + \p}
\xdef\pgfpie@sum{\pgfmathresult}
}
}
{}
但添加后\RequirePackage{pgfplots}
却出现更多错误。
如何正确调整pgf-pie.sty
才能支持更大的值?
答案1
不幸的是,无法直接输入大数字。该fpu
库无法使用有两个原因。首先,数字格式与 不兼容\ifnum
(内部使用pgf-pie
),因为即使使用\pgfkeys{/pgf/fpu/output format=fixed}
类似\pgfmathparse{int(...)}
也会给出带有小数点的结果(例如0.0
)。其次,pgf
内部将给定的长度分配给 dimen 寄存器,这会导致dimension too large
大数字出错。
但是可以使用fpu
库、新键 ( scale numbers
)、小宏 ( \pgfpie@scalenumber
) 和一些修补来缩放数字。这样,您仍然必须输入较小的数字(它们的总和不得超过 16383),但您可以给出缩放因子,以便饼图包含大数字。此外,您必须设置精度来控制小数位。我在\pgfmathprintnumber
这里使用它来获得更好的数字格式,如果您愿意,这也可以得到科学计数法。
代码:
\documentclass[border=2mm]{standalone}
\usepackage{etoolbox}
\usepackage{pgf-pie}
\usetikzlibrary{fpu}
\makeatletter
% new key
\pgfkeys{/scale numbers/.store in=\pgfpie@scale,
/scale numbers=1}
% macro for scaling
\newcommand*{\pgfpie@scalenumber}[1]{%
\begingroup
\pgfkeys{/pgf/fpu}% enable fpu only locally
\pgfmathparse{#1*\pgfpie@scale}%
%\pgfmathroundtozerofill{\pgfmathresult}%
\pgfmathprintnumber{\pgfmathresult}%
\endgroup
}
% patching the internal commands
\patchcmd{\pgfpie@slice}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\patchcmd{\pgfpie@slice}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\patchcmd{\pgfpie@square}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\patchcmd{\pgfpie@square}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\patchcmd{\pgfpie@cloud}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\patchcmd{\pgfpie@cloud}{\beforenumber#3}{\beforenumber\pgfpie@scalenumber{#3}}{}{}
\makeatother
\begin{document}
\begin{tikzpicture}
% set up number formatting
\pgfkeys{/pgf/number format/.cd,
fixed,fixed zerofill,precision=0,
set thousands separator={\,}}
\pie[sum=auto,scale numbers=1000]{1234.567/foo,1234.567/bar,1234.567/baz}
\end{tikzpicture}
\end{document}
结果:
答案2
这轮图我写的包,可以使用。
它可以处理更大的值,pgfmath
因为它内部使用\fp_eval:n
来自l3fp
切片的值。
\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\usepackage{siunitx}
\begin{document}
\begin{tikzpicture}
\wheelchart[
counterclockwise,
pie,
slices style={\WCvarB,draw=black},
start angle=0,
wheel data=\num{\WCvarA}
]{%
1234567/blue!60/foo,
1234567/cyan!60/bar,
1234567/yellow!60/baz%
}
\end{tikzpicture}
\end{document}