![Kiviat 图:如何自动在每个球附近添加数值](https://linux22.com/image/359295/Kiviat%20%E5%9B%BE%EF%BC%9A%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E5%9C%A8%E6%AF%8F%E4%B8%AA%E7%90%83%E9%99%84%E8%BF%91%E6%B7%BB%E5%8A%A0%E6%95%B0%E5%80%BC.png)
平均能量损失
\documentclass[border=10pt]{standalone}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tkz-kiviat,numprint,fullpage}
\usetikzlibrary{arrows}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\tkzKiviatDiagram[
radial = 5,
gap = 1,
lattice = 5]{CO1,CO2,CO3,CO4,CO5}
\tkzKiviatLine[
ultra thick,
color=blue,
mark=ball,
mark size=4pt,
fill=blue!20,opacity=.5
](3,3.5,3,4,3.8)
\tkzKiviatGrad[prefix=,unity=1](5)
\end{tikzpicture}
\end{document}
结果
如何在相应点附近添加值 3、3.5、3、4 和 3.8......
答案1
以下示例使用一些内部函数来定义一个坐标系,其中rang
包含轴数和的选项value
。然后将标签放置在适当的位置。该示例还涉及\tkzKiviatLine
记住第二个示例中所需的值列表。
\documentclass[border=10pt]{standalone}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tkz-kiviat,numprint,fullpage}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\thispagestyle{empty}
\makeatletter
\let\org@tkz@KiviatLine\tkz@KiviatLine
\def\tkz@KiviatLine[#1](#2,#3){%
\def\KiviatValues{#2,#3}%
\org@tkz@KiviatLine[{#1}]({#2},{#3})%
}
\newcommand*{\KiviatRadial}{\tkz@kiv@radial}
\define@key{kiviatkeys}{rang}{\pgfmathsetmacro\kiviat@rang{#1}}
\define@key{kiviatkeys}{value}{\pgfmathsetmacro\kiviat@value{#1}}
\tikzdeclarecoordinatesystem{kiviat}{%
\setkeys{kiviatkeys}{#1}%
\pgfpointpolarxy{%
360/\tkz@kiv@radial*\kiviat@rang
}{%
\kiviat@value*\tkz@kiv@gap*\tkz@kiv@step
}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\tkzKiviatDiagram[
radial = 5,
gap = 1,
lattice = 5,
]{CO1,CO2,CO3,CO4,CO5}
\tkzKiviatLine[
ultra thick,
color=blue,
mark=ball,
mark size=4pt,
fill=blue!20,opacity=.5,
](3,3.5,3,4,3.8)
\tkzKiviatGrad[prefix=,unity=1](5)
\def\x(#1,#2)[#3]{%
(kiviat cs:rang=#1, value=#2) node[#3] {#2}%
}
\path
\x(0, 3)[above right]
\x(1, 3.5)[above left]
\x(2, 3)[below left=-.2em and .2em]
\x(3, 4)[below=.3em]
\x(4, 3.8)[below right=-.1em and .1em]
;
\end{tikzpicture}
\end{document}
寻找标签最佳放置位置的算法要麻烦得多。必须考虑轴角、值、标签大小、与相邻点的连接线。因此,以下示例只是第一步,只需将标签放置在轴外侧点附近即可。
\path
\foreach \v [count=\rang from 0] in \KiviatValues {
($(kiviat cs:rang=\rang, value=\v)!-.55em!(0, 0)$)
node[
anchor=360/\KiviatRadial*\rang-180,
circle,
inner sep=.1em,
fill=white,
] {\v}
}
;
与正常的白色背景相同:
答案2
标记命令:
\tkzKiviatLabeling{<axis>}{<distance/pos>}{<label>}
因此,您可以使用在轴(第二轴)上\tkzKiviatLabeling{2}{3.5}{3.5}
设置标签。您可以使用旋转标签位置,默认为度。轴上的距离是加上的值(在点和点之间添加额外的空间3.5
CO2
\tkzKiviatAxisAngAdd
4
3.5
\tkzKiviatAxisDistAdd
靠近每个球的参数:减少重叠问题
\tkzKiviatAxisDistAdd
:点和标签之间的径向距离\tkzKiviatAxisAngAdd
:轴和标签之间的角度
可以用数组预先定义这些值\def\Values{{3,3.5,3,4,3.8}}
(稍后在标记循环中使用),但它不起作用,\tkzKiviatLine[
所以您必须像问题中那样添加这些值。
标签循环:
\foreach[count=\i from 1] \x in {1,...,\tkzKiviatAxisCount}{
\pgfmathparse{\Values[\i-1]}\edef\saveresult{\pgfmathresult}
\tkzKiviatLabeling{\i}{\saveresult}{\saveresult}
}
结果:
梅威瑟:
\documentclass[border=10pt]{standalone}
\usepackage{tkz-kiviat}
\usetikzlibrary{arrows}
\newcommand{\tkzKiviatAxisCount}{5}
\newcommand{\tkzKiviatAxisDistAdd}{\tkzKiviatAxisCount/10}%or value like 5...
\newcommand{\tkzKiviatAxisAngAdd}{4}%degree
\newcommand{\tkzKiviatLabeling}[3]{
\pgfmathsetmacro{\kivaxisangle}{360/\tkzKiviatAxisCount}
\pgfmathtruncatemacro{\direction}{#1-1}
\node at (\kivaxisangle*\direction+\tkzKiviatAxisAngAdd:#2+\tkzKiviatAxisDistAdd) {#3};
}
\def\Values{{3,3.5,3,4,3.8}}
\begin{document}
\begin{tikzpicture}
\tkzKiviatDiagram[radial=\tkzKiviatAxisCount,gap=1,lattice = \tkzKiviatAxisCount]{CO1,CO2,CO3,CO4,CO5}
\tkzKiviatLine[ultra thick,color=blue,mark=ball,mark size=4pt,fill=blue!20,opacity=.5](3,3.5,3,4,3.8)
\tkzKiviatGrad[prefix=,unity=1](\tkzKiviatAxisCount)
%auto:
\foreach[count=\i from 1] \x in {1,...,\tkzKiviatAxisCount}{
\pgfmathparse{\Values[\i-1]}\edef\saveresult{\pgfmathresult}
\tkzKiviatLabeling{\i}{\saveresult}{\saveresult}
}
% manu:
% \tkzKiviatLabeling{1}{3}{3}
% \tkzKiviatLabeling{2}{3.5}{3.5}
% \tkzKiviatLabeling{3}{3}{3}
% \tkzKiviatLabeling{4}{4}{4}
% \tkzKiviatLabeling{5}{3.8}{3.8}
\end{tikzpicture}
\end{document}