我尝试使用以下代码来可视化嵌套的圆圈:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,fpu}
\usetikzlibrary{decorations.text}
\begin{document}
\def\sizeA{1.248800}
\def\sizeB{.801900}
\def\sizeC{.450300}
\def\sizeD{.255400}
\def\baseRad{5}
\begin{tikzpicture}[rotate=90,%
textDiscLabel/.style={%
postaction={%
decorate,decoration={%
text along path,%
reverse path=true,%
raise=-2ex,%
text={#1}}
}
}
]
\pgfmathsetmacro{\dRatio}{(\sizeD)/(\sizeA)}
\pgfmathsetmacro{\cRatio}{(\sizeC)/(\sizeA)}
\pgfmathsetmacro{\bRatio}{(\sizeB)/(\sizeA)}
\draw[fill=black!30] (0,0) circle (\baseRad);
\path [textDiscLabel={Size A - 1,248,800}] (0,0) circle (\baseRad);
\pgfmathparse{\baseRad*(\bRatio-1)}
\draw[fill=red!40] (\pgfmathresult,0) circle (\bRatio*\baseRad);
\path [textDiscLabel={Size B - 801,900}] (\pgfmathresult,0) circle (\bRatio*\baseRad);
\pgfmathparse{\baseRad*(\cRatio-1)}
\draw[fill=green!50] (\pgfmathresult,0) circle (\cRatio*\baseRad);
\path [textDiscLabel={Size C - 450,300}] (\pgfmathresult,0) circle (\cRatio*\baseRad);
\pgfmathparse{\baseRad*(\dRatio-1)}
\draw[fill=blue!40] (\pgfmathresult,0) circle (\dRatio*\baseRad);
\path [textDiscLabel={Size D - 255,400}] (\pgfmathresult,0) circle (\dRatio*\baseRad);
\end{tikzpicture}
\end{document}
得到以下图片:
我无法调整沿圆盘周边的文本位置。特别是,我希望它相对于穿过圆心的垂直线居中。我该怎么做?我正在寻找一个编程解决方案,因为我使用的值可能会(并且会)发生变化(因此圆盘的半径也会发生变化)。
附加问题:如您所见,我拥有的值介于 10^6 到 10^5 之间。PGF
无法计算比率(sizeA
太大)。我该如何克服这个问题并自动执行计算和标记?
答案1
以下内容应该有助于简化一些事情。text align
关键是将装饰文本置于路径的中心,但我会使用圆弧来绘制圆,因为从同一点开始绘制圆的边框更容易,而且还可以提前知道路径的中心在哪里。
这也是解决缩放问题的部分且不是特别稳健(或准确)的解决方案:sp
在比率计算中使用单位。请注意,原帖中的数字格式已丢失。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.text}
\begin{document}
\def\sizeA{1248800}
\def\sizeB{801900}
\def\sizeC{450300}
\def\sizeD{255400}
\begin{tikzpicture}[x=5cm, y=5cm,
textDiscLabel/.style={%
decorate,
decoration={%
text along path,%
text align=center,
reverse path=true,%
raise=-2ex,%
text={#1}}
}]
\pgfmathsetmacro{\dRatio}{(\sizeD sp)/(\sizeA sp)}
\pgfmathsetmacro{\cRatio}{(\sizeC sp)/(\sizeA sp)}
\pgfmathsetmacro{\bRatio}{(\sizeB sp)/(\sizeA sp)}
\draw [fill=black!30, postaction={textDiscLabel={Size A - \sizeA}}]
(0,0) arc (-90:270:1) -- cycle;
\draw [fill=red!40, postaction={textDiscLabel={Size B - \sizeB}}]
(0,0) arc (-90:270:\bRatio) -- cycle;
\draw [fill=green!40, postaction={textDiscLabel={Size C - \sizeC}}]
(0,0) arc (-90:270:\cRatio) -- cycle;
\draw [fill=blue!40, postaction={textDiscLabel={Size D - \sizeD}}]
(0,0) arc (-90:270:\dRatio) -- cycle;
\end{tikzpicture}
\end{document}
答案2
这是从 Mark Wibrow 的答案中得出的解决方案,其中包含格式化的数字。我习惯\pgfmathprintnumberto
在宏中打印每个数字,然后将其附加{}
到此宏中(text along path
似乎对文本末尾的数学不太满意)。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.text}
\begin{document}
\def\sizeA{1248800}
\def\sizeB{801900}
\def\sizeC{450300}
\def\sizeD{255400}
\begin{tikzpicture}[x=5cm, y=5cm,
textDiscLabel/.style={%
decorate,
decoration={%
text along path,%
text align=center,
reverse path=true,%
raise=-2ex,%
text={#1}}
}]
\pgfmathsetmacro{\dRatio}{(\sizeD sp)/(\sizeA sp)}
\pgfmathsetmacro{\cRatio}{(\sizeC sp)/(\sizeA sp)}
\pgfmathsetmacro{\bRatio}{(\sizeB sp)/(\sizeA sp)}
\pgfkeys{/pgf/number format/.cd,fixed}
\pgfmathprintnumberto{\sizeA}{\numA}\edef\numA{\numA{}}
\pgfmathprintnumberto{\sizeB}{\numB}\edef\numB{\numB{}}
\pgfmathprintnumberto{\sizeC}{\numC}\edef\numC{\numC{}}
\pgfmathprintnumberto{\sizeD}{\numD}\edef\numD{\numD{}}
\draw [fill=black!30, postaction={textDiscLabel={Size A - \numA}}]
(0,0) arc (-90:270:1) -- cycle;
\draw [fill=red!40, postaction={textDiscLabel={Size B - \numB}}]
(0,0) arc (-90:270:\bRatio) -- cycle;
\draw [fill=green!40, postaction={textDiscLabel={Size C - \numC}}]
(0,0) arc (-90:270:\cRatio) -- cycle;
\draw [fill=blue!40, postaction={textDiscLabel={Size D - \numD}}]
(0,0) arc (-90:270:\dRatio) -- cycle;
\end{tikzpicture}
\end{document}
答案3
我让 OP 的设置工作了,尽管 Mark Wibrow 的答案要好得多。我不明白技术细节,所以\pgfmathparse
必须进一步研究。不过,记录如下:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,fpu}
\usetikzlibrary{decorations.text}
\begin{document}
\def\sizeA{1.248800}
\def\sizeB{.801900}
\def\sizeC{.450300}
\def\sizeD{.255400}
\def\baseRad{5}
\begin{tikzpicture}[rotate=90,%
textDiscLabel/.style={%
postaction={%
decorate,decoration={%
text along path,%
reverse path=true,%
text align = {align=center},
raise=-2ex,%
text={#1}}
}
}
]
\pgfmathsetmacro{\dRatio}{(\sizeD)/(\sizeA)}
\pgfmathsetmacro{\cRatio}{(\sizeC)/(\sizeA)}
\pgfmathsetmacro{\bRatio}{(\sizeB)/(\sizeA)}
\pgfmathsetmacro{\ddRatio}{\baseRad*(1-(\sizeD)/(\sizeA))}
\pgfmathsetmacro{\ccRatio}{\baseRad*(1-(\sizeC)/(\sizeA))}
\pgfmathsetmacro{\bbRatio}{\baseRad*(1-(\sizeB)/(\sizeA))}
\draw[fill=black!30] (0,0) circle (\baseRad);
\path [textDiscLabel={Size A - 1,248,800},rotate=180] (0,0) circle (\baseRad);
\pgfmathparse{\baseRad*(\bRatio-1)}
\draw[fill=red!40] (\pgfmathresult,0) circle (\bRatio*\baseRad);
\path [textDiscLabel={Size B - 801,900},rotate=180] (\bbRatio,0) circle (\bRatio*\baseRad);
\pgfmathparse{\baseRad*(\cRatio-1)}
\draw[fill=green!50] (\pgfmathresult,0) circle (\cRatio*\baseRad);
\path [textDiscLabel={Size C - 450,300},rotate=180] (\ccRatio,0) circle (\cRatio*\baseRad);
\pgfmathparse{\baseRad*(\dRatio-1)}
\draw[fill=blue!40] (\pgfmathresult,0) circle (\dRatio*\baseRad);
\path [textDiscLabel={Size D - 255,400},rotate=180] (\ddRatio,0) circle (\dRatio*\baseRad);
\end{tikzpicture}
\end{document}