我正在写我的学士论文,在绘制蜘蛛网图时遇到了一些问题。我尝试使用 csvsimple 包从 csv 文件加载数据,但 latex 将 D1 到 D7 解释为函数。有什么方法可以阻止 pgf 这样做吗?
这是错误:!包 PGF 数学错误:未知函数“D1”(在‘D1-11’中)。
\documentclass[cleardoublepage=empty, listof=totoc, bibliography=totoc, index=totoc, 11pt, abstracton, numbers=noenddot, oneside,titlepage,openright,headings=normal]{scrreprt}
\usepackage{filecontents}
\usepackage{csvsimple}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{shapes}
\begin{document}
\begin{filecontents*}{data.csv}
Vertreter;Portability;Compatibility;Performance efficiency;Usability;Security;Reliability;Functional Suitability
SAPUI5;12,4;10,4;11,0;14,9;10,5;15,0;15,0
Apache Cordova;11,9;13,2;10,7;9,9;11,0;15,0;14,8
Xamarin;11,4;13,2;15,0;12,8;11,9;15,0;14,1
Android ;7,8;13,2;15,0;12,8;11,9;15,0;14,1
\end{filecontents*}
\newcommand{\D}{7} % number of dimensions (config option)
\newcommand{\U}{7} % number of scale units (config option)
\newdimen\R % maximal diagram radius (config option)
\R=3.5cm
\newdimen\L % radius to put dimension labels (config option)
\L=4.5cm
\newcommand{\A}{360/\D} % calculated angle between dimension axes
\begin{figure}
\centering
\begin{tikzpicture}[scale=1]
\path (0:0cm) coordinate (O); % define coordinate for origin
% draw the spiderweb
\foreach \X in {1,...,\D}{
\draw (\X*\A:0) -- (\X*\A:\R);
}
\foreach \Y in {0,...,\U}{
\foreach \X in {1,...,\D}{
\path (\X*\A:\Y*\R/\U) coordinate (D\X-\Y);
\fill (D\X-\Y) circle (1pt);
}
\draw [opacity=0.3] (0:\Y*\R/\U) \foreach \X in {1,...,\D}{
-- (\X*\A:\Y*\R/\U)
} -- cycle;
}
% define labels for each dimension axis (names config option)
\path (1*\A:\L) node (L1) {\tiny Portabilität};
\path (2*\A:\L) node (L2) {\tiny Kompatibilität};
\path (3*\A:\L) node (L3) {\tiny Leistungseffizienz};
\path (4*\A:\L) node (L4) {\tiny Usability};
\path (5*\A:\L) node (L5) {\tiny Sicherheit};
\path (6*\A:\L) node (L6) {\tiny Verlässlichkeit};
\path (7*\A:\L) node (L7) {\tiny Funkt. Eignung};
\csvreader[separator=semicolon]
{data.csv}
{Vertreter=\v,Portability=\port,Compatibility=\comp,Performance efficiency=\perf,Usability=\use,Security=\secur,Reliability=\rel,Functional Suitability=\func}
{
\draw[color=blue,line width=1.5pt,opacity=0.5]
(D1-\perf) --
(D2-\comp) --
(D3-\perf) --
(D4-\use) --
(D5-\secur) --
(D6-\rel) --
(D7-\func) -- cycle;
}
\end{tikzpicture}
\caption{Spiderweb Diagram (\D~Dimensions, \U-Notch Scale, 3 Samples)}
\label{fig:spiderweb}
\end{figure}
\end{document}
答案1
在您的代码中,您沿着网络的每个“分支”定义了七个命名坐标,例如D1-1
,,D1-2
......。D1-7
但您的数据有十进制值,而不是索引。
以“性能效率”列中的第一个值为例,即11,4
。在\draw
语句中使用(D1-\perf)
,它变为(D1-11,4)
。我认为 TikZ 将其解释为笛卡尔坐标,因为它具有结构(x,y)
。而且因为x
-component 不是数值,它会尝试将其解释为函数,但当然没有函数D1-11
。
(而且第一个坐标应该是\port
,而不是\perf
。)
(D1-\perf)
您可能想要的是这样的坐标,而不是 这样的坐标(\A*1:\perf/\datascale)
。您可能知道,这些是极坐标。\datascale
是一个新的宏,它只包含一个数字,您可以调整它以获得适当的缩放比例。但要使其工作,您必须将数据中的逗号替换为句点。
在下面的代码中,我还在数据中添加了一个新列,用于显示线条的颜色,如果您想要使用不同的颜色。为了好玩,可以在右侧添加一个图例。
\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\usepackage{csvsimple}
\usepackage{pgfplots} % loads tikz
\usetikzlibrary{shapes}
\begin{document}
% replaced commas with periods
% added colour-column
\begin{filecontents*}{data.csv}
Vertreter;Portability;Compatibility;Performance efficiency;Usability;Security;Reliability;Functional Suitability;colour
SAPUI5;12.4;10.4;11.0;14.9;10.5;15.0;15.0;blue
Apache Cordova;11.9;13.2;10.7;9.9;11.0;15.0;14.8;red
Xamarin;11.4;13.2;15.0;12.8;11.9;15.0;14.1;green
Android ;7.8;13.2;15.0;12.8;11.9;15.0;14.1;cyan
\end{filecontents*}
\newcommand{\D}{7} % number of dimensions (config option)
\newcommand{\U}{7} % number of scale units (config option)
\newdimen\R % maximal diagram radius (config option)
\R=3.5cm
\newdimen\L % radius to put dimension labels (config option)
\L=4.5cm
\newcommand{\A}{360/\D} % calculated angle between dimension axes
\begin{figure}
\centering
\begin{tikzpicture}[scale=1]
\path (0:0cm) coordinate (O); % define coordinate for origin
% draw the spiderweb
\foreach \X in {1,...,\D}{
\draw (\X*\A:0) -- (\X*\A:\R);
}
\foreach \Y in {0,...,\U}{
\foreach \X in {1,...,\D}{
\path (\X*\A:\Y*\R/\U) coordinate (D\X-\Y);
\fill (D\X-\Y) circle (1pt);
}
\draw [opacity=0.3] (0:\Y*\R/\U) \foreach \X in {1,...,\D}{
-- (\X*\A:\Y*\R/\U)
} -- cycle;
}
% define labels for each dimension axis (names config option)
\foreach [count=\i] \txt in
{Portabilität,Kompatibilität,Leistungseffizienz,
Usability,Sicherheit,Verlässlichkeit,Funkt. Eignung}
\node [font=\tiny] (L\i) at (\i*\A:\L) {\txt};
% common scale factor for the values
\newcommand\datascale{5}
\csvreader[separator=semicolon]
{data.csv}
{Vertreter=\v,Portability=\port,Compatibility=\comp,
Performance efficiency=\perf,Usability=\use,Security=\secur,
Reliability=\rel,Functional Suitability=\func,colour=\clr}
{
\draw[\clr,line width=1.5pt,opacity=0.5]
(\A*1:\port/\datascale) --
(\A*2:\comp/\datascale) --
(\A*3:\perf/\datascale) --
(\A*4:\use/\datascale) --
(\A*5:\secur/\datascale) --
(\A*6:\rel/\datascale) --
(\A*7:\func/\datascale) -- cycle;
% add legend
\draw [line width=1.5pt,\clr,opacity=0.5] (\R*1.2,\R-12pt*\thecsvrow) -- ++(1,0) node[right,opacity=1,black] {\v};
}
\end{tikzpicture}
\caption{Spiderweb Diagram (\D~Dimensions, \U-Notch Scale, 3 Samples)}
\label{fig:spiderweb}
\end{figure}
\end{document}