pgf-pie:尺寸太大

pgf-pie:尺寸太大

我使用了该包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}

相关内容