如何根据节点名称改变其样式?

如何根据节点名称改变其样式?

我已经使用 pgf-pie 创建了饼图,并且遇到了与此完全相同的问题pgf-pie 问题

我修改了 pgf-pie 代码,在主圆外绘制小百分比。但还有一个问题:如果数字非常小,这些值会相互叠加:enter image description here

恕我直言,这只能在图表本身上修复。我为所有打印百分比值的节点添加了名称。我想更改这些节点的样式或位置。有什么办法吗?

更改了第 58 行的 pgf-pie 代码。

%\path (O) -- ++(\midangle:\innerpos) 
%node {\scalefont{#3}\beforenumber\fnum\afternumber};

\pgfmathprintnumberto{#3}{\fnum} 

\ifthenelse{\lengthtest{#3 pt < 10pt}}
{
\path (O) -- ++ (\midangle:\radius)
node[inner sep=0,align=left,anchor=west,rotate=\midangle](nums#3){~~\fnum};
}
{    
\path (O) -- ++(\midangle:\innerpos) 
node {\scalefont{#3}\beforenumber\fnum\afternumber};
}

图表:

\begin{tikzpicture}[every legend entry/.append style={text width=5cm,font=\footnotesize},scale=0.95]
\pie[
    sum=auto,
    text=legend, 
    rotate =90,
    radius=5.0,
    after number=\%,
    ]   
    {
    0.444/message transport other,
    67.792/sign,
    0.175/forwarding,
    0.433/links send other ,
    1.093/serialize message,
    2.336/send message,
    2.336/link receive ,
    2.232/forwarding receive ,
    10.770/parse signature block,
    11.818/verify signature,
    0.570/parse message content}

    %\draw (0,0) node[outer sep=0pt,fill=blue,below of=nums0.433,anchor=west] {filled};\end{tikzpicture}

答案1

pgf-pie由于该软件包缺乏灵活性(以及使用主 PGFkeys 路径),我不太推荐它,但是由于您已经更改了其原始代码,因此您可以为您的节点添加一种特殊样式:

\path (O) -- ++ (\midangle:\radius) node[
  inner sep=0, align=left, anchor=west, rotate=\midangle,
  special style={\midangle}{#3}] (nums#3) {\beforenumber\fnum\afternumber};

如果您正确设置special style以便它检查(它自己),#2它可以应用另一个类似的转变shift=(#1:1cm)(当然可以用其他样式和/或值进行设置。

我怀疑#3是不是您可以使用的最佳参数,因为它将包含您值中的小数点(如果您想引用这样的节点,它将被理解为节点名称和其锚点之间的分隔符)。您可能只想\i在这里使用(对于名称和特殊样式),它pgf-pie实际上用作循环的计数器宏(参见第 407ff 行的定义\pie),但不会转发到\pgfpie@slice

答案2

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

定义一个命令\WCtest,其输出取决于百分比是否大于 3。此命令用于键datawheel data。此处,使用 来获取百分比\WCperc

使用 键移动数据放置点的角度data angle shift

图例由键决定legend。这是一个tabular放置在 中的\node。行由键决定legend row。可以使用 获得所有行的结果\WClegend

在密钥中slices style我们使用\WClistcolors引用给定密钥的列表中的项目WClistcolors

enter image description here

\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\usepackage{siunitx}
\begin{document}
\begin{tikzpicture}
\def\WCtest#1#2{%
    \pgfmathparse{\WCpercentage>3?"#1":"#2"}%
    \pgfmathresult%
}
\wheelchart[
  counterclockwise,
  data=\WCtest{}{\WCperc},
  data angle shift=\WCvarB,
  data style={rotate=\WCmidangle,anchor=west},
  legend row={\tikz\fill[\WClistcolors,draw=black] (0,0) rectangle (0.3,0.3); & \WCvarC},
  legend={
    \node[anchor=west] at (6,3.5) {%
      \begin{tabular}{l@{ }l}%
      \WClegend%
      \end{tabular}%
    };
  },
  perc precision=2,
  radius={0}{5},
  slices style={\WClistcolors,draw=black},
  WClistcolors={blue!60,cyan!60,yellow!60,orange!60,red!60,blue!60!cyan!60,cyan!60!yellow!60,red!60!cyan!60,red!60!blue!60,orange!60!cyan!60,blue!60},
  wheel data=\WCtest{\WCperc}{}
]{%
  0.444/1/message transport other,
  67.792/0/sign,
  0.175/-3/forwarding,
  0.433/0/links send other,
  1.093/1/serialize message,
  2.336/0/send message,
  2.336/0/link receive,
  2.232/0/forwarding receive,
  10.770/0/parse signature block,
  11.818/0/verify signature,
  0.570/-1/parse message content%
}
\end{tikzpicture}
\end{document}

相关内容