如何制作连接点和目标的线 - tikzpicture

如何制作连接点和目标的线 - tikzpicture

我已经能够执行下面的代码但它仍然不是我需要的。

我需要点 a1 到 a5 形成一条到点“Gol”的直线。

我怎么做?

.dat 文件如下所示(inimigo.dat):

52 10 a0
3 41 a1
51 52 a2
22 62 a3
36 32 a4

蓬托菲索

115 45 Goal

最佳数据

66.6357 27.6357 g0
48.2417 38.2417 g1
53.5413 63.5413 g2
57.8469 18.8469 g3
75.6483 40.2518 g4

初始数据

65  26  i0
47  37  i1
6   16  i2
44  5   i3
58  6   i4

利用这些坐标,如何从点 a0 到点“Gol”画一条线?

\documentclass[varwidth]{standalone}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{geometry}
\geometry{
 paperwidth=25cm,
 left=1in,right=1in,top=1in,bottom=1in
}
\begin{document}
\begin{figure}[h]
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]

     \addplot +[only marks,mark=*,nodes near coords={\labelz}, visualization depends on={value \thisrowno{2}\as\labelz}] 
               table[header=false]{pontofixo.dat};

    \addplot +[only marks,mark=*,nodes near coords={\labelz}, visualization depends on={value \thisrowno{2}\as\labelz}] 
                table[header=false]{inimigo.dat};

        \addplot +[only marks,mark=*,nodes near coords={\labelz},visualization depends on={value \thisrowno{2}\as\labelz}] 
                table[header=false]{inicial.dat};

  \end{axis}
  \end{tikzpicture}
\caption{Estado inicial}
\end{subfigure}%
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]

     \addplot +[only marks,mark=*,nodes near coords={\labelz}, visualization depends on={value \thisrowno{2}\as\labelz}] 
               table[header=false]{pontofixo.dat};

    \addplot +[only marks,mark=*,nodes near coords={\labelz}, visualization depends on={value \thisrowno{2}\as\labelz}] 
                table[header=false]{inimigo.dat};

       \addplot +[only marks,mark=*,nodes near coords={\labelz}, visualization depends on={value \thisrowno{2}\as\labelz}] 
                table[header=false]{gbest.dat};
  \end{axis}
  \end{tikzpicture}
  \caption{Estado final}
\end{subfigure}%
\end{figure}
\end{document}

由此得到以下结果: 在此处输入图片描述

但我需要类似的(在 inskcape 中编辑): 在此处输入图片描述

答案1

全面修订: 在我回答了这个问题之后的一段时间,我偶然发现了这个很酷的技巧,这样就可以以更优雅的方式实现目标。在我想起我原来的代码后这个问题,我觉得我需要更新这个答案

\documentclass[varwidth]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{inimigo.dat}
x y label
52 10 a0
3 41 a1
51 52 a2
22 62 a3
36 32 a4
\end{filecontents*}
\begin{filecontents*}{pontofixo.dat}
x y label
115 45 Goal
\end{filecontents*}
\begin{filecontents*}{inicial.dat}
x y label
65  26  i0
47  37  i1
6   16  i2
44  5   i3
58  6   i4
\end{filecontents*}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{geometry}
\geometry{
 paperwidth=25cm,
 left=1in,right=1in,top=1in,bottom=1in
}
\pgfplotsset{% https://tex.stackexchange.com/a/75811/121799
    name nodes near coords/.style={
        every node near coord/.append style={
            name=#1-\coordindex,
            alias=#1-last,
        },
    },
    name nodes near coords/.default=coordnode
}
\begin{document}
\begin{figure}[h]
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]

    \addplot +[only marks,mark=*,nodes near
     coords={\labelz}, 
     visualization depends on={value \thisrowno{2}\as\labelz},
     name nodes near coords=Gol] 
               table{pontofixo.dat}; % this defines the coordinate (Goal)
               % if I do not define it, the next sequence will throw an error
    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz}, 
    visualization depends on={value \thisrowno{2}\as\labelz},
    name nodes near coords=a] 
                table{inimigo.dat};

    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz}, 
    visualization depends on={value \thisrowno{2}\as\labelz},
    name nodes near coords=i] 
                table{inicial.dat};


  \end{axis}
 \foreach \n in {0,...,4}
 {
 \draw[black,thick,dashed] (a-\n.south) -- (Gol-0.south);
 \draw[black,thick,dashed] (i-\n.south) -- (Gol-0.south);
 }
  \end{tikzpicture}
\caption{Estado inicial}
\end{subfigure}%
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]

     \addplot +[only marks,mark=*,nodes near
     coords={\labelz}, 
     visualization depends on={value \thisrowno{2}\as\labelz},
     name nodes near coords=Gol] 
               table{pontofixo.dat}; % this defines the coordinate (Goal)
               % if I do not define it, the next sequence will throw an error
    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz}, 
    visualization depends on={value \thisrowno{2}\as\labelz},
     name nodes near coords=a] 
                table{inimigo.dat};

    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz}, 
    visualization depends on={value \thisrowno{2}\as\labelz},
    name nodes near coords=g] 
                table{gbest.dat};

  \end{axis}
 \foreach \n in {0,...,4}
 {
 \draw[black,thick,dashed] (a-\n.south) -- (Gol-0.south);
 \draw[black,thick,dashed] (g-\n.south) -- (Gol-0.south);
 }
 \end{tikzpicture}
 \caption{Estado final}
\end{subfigure}%
\end{figure}
\end{document}

在此处输入图片描述

老的:这是我原来的解决方案。

\documentclass[varwidth]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{inimigo.dat}
x y label
52 10 a0
3 41 a1
51 52 a2
22 62 a3
36 32 a4
\end{filecontents*}
\begin{filecontents*}{pontofixo.dat}
x y label
115 45 Goal
\end{filecontents*}
\begin{filecontents*}{inicial.dat}
x y label
65  26  i0
47  37  i1
6   16  i2
44  5   i3
58  6   i4
\end{filecontents*}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{geometry}
\geometry{
 paperwidth=25cm,
 left=1in,right=1in,top=1in,bottom=1in
}
\begin{document}
\begin{figure}[h]
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]

\xdef\DoLater{}

     \addplot +[only marks,mark=*,nodes near
     coords={\makebox[0pt]{\coordinate(\labelz) at (\myx,\myy);}\labelz}, 
     visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
               table{pontofixo.dat}; % this defines the coordinate (Goal)
               % if I do not define it, the next sequence will throw an error
    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz\makebox[0pt]{\coordinate(\labelz) at
    (\myx,\myy);
    \xdef\DoLater{\DoLater,\labelz}
    }}, visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
                table{inimigo.dat};

    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz\makebox[0pt]{\coordinate(\labelz) at
    (\myx,\myy);
    \xdef\DoLater{\DoLater,\labelz}
    }}, visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
                table{inicial.dat};


  \end{axis}
  \foreach \Point in \DoLater{
\ifx\Point\empty%
\relax
\else
\draw (\Point) -- (Goal);
\fi
}
  \end{tikzpicture}
\caption{Estado inicial}
\end{subfigure}%
\centering
\begin{subfigure}{.4\textwidth}
  \centering
  \begin{tikzpicture}
  \begin{axis}[xmin=0,xmax=120,ymin=0,ymax=90, xstep=1,ystep=1,nodes near coords,enlargelimits=0.0]


\xdef\DoLater{}

     \addplot +[only marks,mark=*,nodes near
     coords={\makebox[0pt]{\coordinate(\labelz) at (\myx,\myy);}\labelz}, 
     visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
               table{pontofixo.dat}; % this defines the coordinate (Goal)
               % if I do not define it, the next sequence will throw an error
    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz\makebox[0pt]{\coordinate(\labelz) at
    (\myx,\myy);
    \xdef\DoLater{\DoLater,\labelz}
    }}, visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
                table{inimigo.dat};

    \addplot +[scatter/position=relative,only marks,mark=*,
    nodes near coords={\labelz\makebox[0pt]{\coordinate(\labelz) at
    (\myx,\myy);
    \xdef\DoLater{\DoLater,\labelz}
    }}, visualization depends on={value \thisrowno{2}\as\labelz},
     visualization depends on={value \thisrow{x}\as\myx},
     visualization depends on={value \thisrow{y}\as\myy}] 
                table{gbest.dat};

  \end{axis}
  \foreach \Point in \DoLater{
\ifx\Point\empty%
\relax
\else
\draw (\Point) -- (Goal);
\fi
}
  \end{tikzpicture}
  \caption{Estado final}
\end{subfigure}%
\end{figure}
\end{document}

在此处输入图片描述

解释:在解析表格时,定义了带有标签的坐标 ... 猜猜看... label,并且坐标也存储在列表中\DoLater。此列表被解析外部环境axis(因为扩展延迟问题),然后绘制连接。(请注意,此版本依赖于坐标标签的唯一性,但\coordindex在将来使用此技巧时,可以直接在标签中添加类似内容以使标签唯一。)

答案2

此解决方案的主要思想是给出nodes near coords一个name,以便以后可以使用/引用它们来绘制连接线。完成后,只需要知道

  • \addplot绘制了多少个s
  • 每个有多少个坐标\addplot

有了这些知识,就很容易画出“目标”的路线。

(我仅给出了第一个图的解决方案,然后可以轻松地将其应用到第二个图上。)

有关详细信息,请查看代码中的注释。

% used PGFPlots v1.15
    \begin{filecontents*}{pontofixo.dat}
        x   y   label
        115 45  Goal
    \end{filecontents*}
    \begin{filecontents*}{inimigo.dat}
        x   y   label
        52  10  a0
        3   41  a1
        51  52  a2
        22  62  a3
        36  32  a4
    \end{filecontents*}
    \begin{filecontents*}{inicial.dat}
        x   y   label
        65  26  i0
        47  37  i1
        6   16  i2
        44  5   i3
        58  6   i4
    \end{filecontents*}
\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        xmin=0,
        xmax=120,
        ymin=0,
        ymax=90,
        enlargelimits=false,
        % moved common options here
        only marks,
        nodes near coords={\labelz},
        % give any "node near coord" a name
        nodes near coords style={
            name=a\plotnum-\coordindex,
        },
        visualization depends on={
            value \thisrowno{2}\as\labelz
        },
        % create a cycle list so there is no need for `\addplot' options
        cycle multiindex* list={
            color\nextlist
            mark=*\nextlist
        },
    ]
        \addplot table {pontofixo.dat};
        \addplot table {inimigo.dat};
        \addplot table {inicial.dat};

            % store the number of plots which will be needed outside the
            % `axis' environment
            \pgfmathtruncatemacro{\NumPlots}{\numplots}

    \end{axis}

    % now draw the lines
    \foreach \tab [count=\plotnumber from 1] in {
        inimigo.dat,
        inicial.dat%
    } {
            % get the number of rows per table so we know how many lines need to
            % be drawn per table
            \pgfplotstablegetrowsof{\tab}
            \pgfmathtruncatemacro{\NoOfRows}{\pgfplotsretval-1}
        \foreach \i in {0,...,\NoOfRows} {
            \draw (a\plotnumber-\i.south) -- (a0-0.south);
        }
    }
\end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容