用数值代替百分比的饼图

用数值代替百分比的饼图

首先,我开始使用 LaTeX 太晚了!感谢这个网站上的所有提示。

我看了下面这个问题的答案。 如何绘制条形图和饼图

此图表使用值 100 作为最大值。我想稍微修改一下,它应该将所有参数相加,并将其用作新的 100%

饼图示例(922 的总和为 100%)

\pie{Pie XYZ}
{337/div,196/drog,191/verm,118/gew,47/staa}

这是原始脚本,评论中是我的想法。坦白说,我以前从未使用过 tex-script,但仅通过谷歌搜索,我无法找到我想要的东西。

非常感谢对 LaTeX 新手提供的任何帮助。

\newcommand{\pie}[3][]{
    \begin{scope}[#1]
    \pgfmathsetmacro{\curA}{90}
    \pgfmathsetmacro{\r}{1}
    \def\c{(0,0)}
    \node[pie title] at (90:1.3) {#2};

% Sum all parameters for max value   
%   \newcounter{tmpSUM}
%   \foreach \v / \s in{#3}{    
%       \setcounter{tmpSUM}{\v}
%   }

    \foreach \v/\s in{#3}{
%       \pgfmathsetmacro{\deltaA}{\v / tmpSUM *360}
        \pgfmathsetmacro{\deltaA}{\v / 100 *360}

        \pgfmathsetmacro{\nextA}{\curA + \deltaA}
        \pgfmathsetmacro{\midA}{(\curA+\nextA)/2}

        \path[slice,\s] \c
            -- +(\curA:\r)
            arc (\curA:\nextA:\r)
            -- cycle;
       \pgfmathsetmacro{\d}{max((\deltaA * -(.5/50) + 1) , .5)}

        \begin{pgfonlayer}{foreground}
        \path \c -- node[pos=\d,pie values,values of \s]{$\v\%$} +(\midA:\r);
        \end{pgfonlayer}

        \global\let\curA\nextA
    }
    \end{scope}
}

答案1

您评论的解决方案更接近实际解决方案。循环遍历值并累加总和的想法tmpSUM非常正确,但是:

  1. 你可能想要使用它\pgfmath来支持非整数值
  2. 的主体\foreach位于一个组中,因此您需要全局分配以使计数器的值超出 for 的范围并在之后可用(请参阅这个答案)。

这可以通过以下方式实现

\pgfmathsetmacro{\tmpSUM}{0}
\foreach \v/\s in{#3}{
    \pgfmathparse{\tmpSUM+\v}
    \global\let\tmpSUM\pgfmathresult
}

然后你可以使用

\pgfmathsetmacro{\deltaA}{\v / \tmpSUM * 360}

答案2

一个可能的解决方案是使用 PSTrickssiunitx如下:

\documentclass{article}

\usepackage{pstricks-add}
\usepackage[
  round-mode = places,
  round-precision = 0
]{siunitx}
\usepackage{xfp}

\newcommand*\total{\fpeval{\honey+\pollen+\water}}
\newcommand*\Honey{\fpeval{\honey/\total*100}}
\newcommand*\Pollen{\fpeval{\pollen/\total*100}}
\newcommand*\Water{\fpeval{\water/\total*100}}

\def\pieSlice[#1](#2)#3#4#5{%
  \rput(psChartI#2){\shortstack[c]{%
      \SI{#3}{\g}\strut\\[-1ex]
      \SI{#4}{\percent}\strut}}
  \ncline{psChartO#2}{psChart#2}
  \nput{#1}{psChartO#2}{#5}}

% parameters
\def\honey{1671}
\def\pollen{1015}
\def\water{621}

\begin{document}

\psset{nodesepB = -5pt}
\begin{pspicture}(-3,-3.5)(4.1,4.1)
  \psChart[
    userColor = {red!60, green!60, blue!60},
    chartNodeO = 1.2,
    shadow = true,
    shadowsize = 5pt,
    linewidth = 0
  ]{\honey,\pollen,\water}{}{3}
  \pieSlice[90](1){\honey}{\Honey}{Honey}
  \pieSlice[-90](2){\pollen}{\Pollen}{Pollen}
  \pieSlice[0](3){\water}{\Water}{Water}
\end{pspicture}

\end{document}

输出

更新

我想我可能误解了你的请求;这是一个仅显示绝对值的版本:

\documentclass{article}

\usepackage{pstricks-add}
\usepackage{siunitx}

\def\pieSlice[#1](#2)#3#4{%
  \rput(psChartI#2){\SI{#3}{\g}}
  \ncline{psChartO#2}{psChart#2}
  \nput{#1}{psChartO#2}{#4}}

% parameters
\def\honey{1671}
\def\pollen{1015}
\def\water{621}

\begin{document}

\begin{pspicture}(-3,-3.5)(4.1,4.1)
  \psChart[
    userColor = {red!60, green!60, blue!60},
    chartNodeO = 1.2,
    shadowsize = 5pt,
    shadow = true,
    linewidth = 0
  ]{\honey,\pollen,\water}{}{3}
  \pieSlice[90](1){\honey}{Honey}
  \pieSlice[-90](2){\pollen}{Pollen}
  \pieSlice[0](3){\water}{Water}
\end{pspicture}

\end{document}

输出2

答案3

轮图我写的包,可以使用。

这些线条是用钥匙获得的lines

值由第一个变量给出\WCvarA。这些值与键一起放置在切片中wheel data=\WCvarA

在此处输入图片描述

\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\begin{document}
\begin{tikzpicture}
\wheelchart[
  lines,
  pie,
  wheel data=\WCvarA
]{%
  337/orange/div,
  196/green/drog,
  191/magenta/verm,
  118/red/gew,
  47/blue/staa%
}
\end{tikzpicture}
\end{document}

相关内容