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}
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}
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}
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 axis
medio 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í \coordindex
a 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 coords
para name
que 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
\addplot
s 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}