使用 TikZ 沿圆周装饰文字

使用 TikZ 沿圆周装饰文字

我尝试使用以下代码来可视化嵌套的圆圈:

\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}

圆圈内居中显示文字。

相关内容