我正在尝试创建一个宏,它将以一对列表作为参数来绘制饼图。我试图使饼图的各个部分指定为小于 1 的分数。下面是我想要实现的具体示例:
\documentclass{article}
\usepackage{pgf,tikz}
\usepackage{ifthen}
\usetikzlibrary{calc}
\begin{document}
\newcounter{a} \newcounter{b}
\newcommand*{\piechart}[1]{
\begin{tikzpicture}[scale=\textwidth/2cm]
\setcounter{a}{0} \setcounter{b}{0}
\foreach \amt/\lbl in {#1}{
\setcounter{a}{\value{b}}
\addtocounter{b}{\amt}
\pgfmathsetmacro{\angleone}{\value{a}*360}
\pgfmathsetmacro{\angletwo}{\value{b}*360}
\pgfmathsetmacro{\midangle}{(\angleone+\angletwo)/2}
\draw[thick] (0,0) -- (\angleone:1) arc (\angleone:\angletwo:1) -- cycle;
\node at (\midangle:0.6) {\lbl};
}
\end{tikzpicture}
}
\piechart{{1/6}/label1, {1/6}/label2, {1/6}/label3, {1/2}/label4}
\end{document}
我认为我的计数器使用存在问题,或者我{}
在参数列表中指定小数值的方式存在问题。
答案1
我同意 @Phelype 的观点,这个网站有很多非常漂亮的饼图示例,从这些示例开始可能会更有优势,而不是重新发明轮子。但正如我在评论中提到的,你不能用计数器来表示分数。而且你必须记住之前的角度来烤饼。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand*{\piechart}[1]{
\begin{tikzpicture}[scale=\textwidth/2cm]
%\setcounter{a}{0} \setcounter{b}{0}
\xdef\PrevFraction{0}
\foreach \amt/\lbl in {#1}{
\pgfmathsetmacro{\angleone}{\PrevFraction*360}
\pgfmathsetmacro{\NewFraction}{\PrevFraction+\amt}
\pgfmathsetmacro{\angletwo}{\NewFraction*360}
\pgfmathsetmacro{\midangle}{(\angleone+\angletwo)/2}
\draw[thick] (0,0) -- (\angleone:1) arc (\angleone:\angletwo:1) -- cycle;
\node at (\midangle:0.6) {\lbl};
\xdef\PrevFraction{\NewFraction}
}
\end{tikzpicture}
}
\piechart{{1/6}/label1, {1/6}/label2, {1/6}/label3, {1/2}/label4}
\end{document}
答案2
计数器是 TeX 表示整数的方式,因此您不能使用分数。TeX 表示具有维度的实数。稍微更改一下您的代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newdimen\a
\newdimen\b
\newcommand*{\piechart}[1]{
\begin{tikzpicture}[scale=\textwidth/2cm]
% \setcounter{a}{0} \setcounter{b}{0}
\global\a=0pt \global\b=0pt
\foreach \amt/\lbl in {#1}{
% \setcounter{a}{\value{b}}
\global\a=\b
% \addtocounter{b}{\amt}
\pgfmathsetmacro{\amt}{\amt}
\global\advance\b \amt pt
\pgfmathsetmacro{\angleone}{\a*360}
\pgfmathsetmacro{\angletwo}{\b*360}
\pgfmathsetmacro{\midangle}{(\angleone+\angletwo)/2}
\draw[thick] (0,0) -- (\angleone:1) arc (\angleone:\angletwo:1) -- cycle;
\node at (\midangle:0.6) {\lbl};
}
\end{tikzpicture}
}
\piechart{{1/6}/label1, {1/6}/label2, {1/6}/label3, {1/2}/label4}
\end{document}