Cómo hacer que las líneas que se unen apunten a un objetivo - tikzpicture

Cómo hacer que las líneas que se unen apunten a un objetivo - tikzpicture

Pude hacer el código a continuación pero todavía no es lo que necesito.

Necesito los puntos a1 a a5 para formar una línea recta hasta el punto "Gol".

¿Cómo puedo hacer eso?

Los archivos .dat tienen este aspecto (inimigo.dat):

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

pontofixo.dat

115 45 Goal

gbest.datos

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

inicial.dat

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

Tomando estas coordenadas, ¿cómo hacer una recta desde el punto a0 hasta el punto "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}

Esto obtiene este resultado: ingrese la descripción de la imagen aquí

pero necesito algo similar (editar en inskcape): ingrese la descripción de la imagen aquí

Respuesta1

REVISIÓN COMPLETA: Algún tiempo después de responder esta pregunta, me encontréeste truco genial, lo que permite alcanzar el objetivo de una forma mucho más elegante. Después de que me recordaron mi código original enesta pregunta, Sentí que necesitaba actualizar esta respuesta a

\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}

ingrese la descripción de la imagen aquí

VIEJO: Aquí está mi solución original.

\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}

ingrese la descripción de la imagen aquí

Explicación: Mientras se analizan las tablas, se definen las coordenadas que tienen la etiqueta... adivine... label, y las coordenadas también se almacenan en una lista \DoLater. Esta lista está analizadaafuerael axismedio ambiente (debido a laproblema de expansión retrasada) y luego se dibujan las conexiones. (Tenga en cuenta que esta versión se basa en que las etiquetas de coordenadas sean únicas, pero es sencillo agregar algo así \coordindexa la etiqueta para que las etiquetas sean únicas en futuras aplicaciones de este truco).

Respuesta2

La idea principal de esta solución es dar a nodes near coordspara nameque luego puedan usarse o hacer referencia a ellos para dibujar las líneas de conexión. Una vez hecho esto sólo falta saberlo.

  • ¿Cuántas \addplots se trazaron y
  • cuantas coordenadas hay en cada una \addplot.

Con este conocimiento es fácil trazar las líneas hacia el "Objetivo".

(Solo presento la solución para el primer gráfico, que luego se puede adoptar fácilmente para el segundo gráfico).

Para más detalles, eche un vistazo a los comentarios en el código.

% 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}

imagen que muestra el resultado del código anterior

información relacionada