首先,我开始使用 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
非常正确,但是:
- 你可能想要使用它
\pgfmath
来支持非整数值 - 的主体
\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}
答案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}