使用 csvsimple 绘制问题蜘蛛网图

使用 csvsimple 绘制问题蜘蛛网图

我正在写我的学士论文,在绘制蜘蛛网图时遇到了一些问题。我尝试使用 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}

相关内容