
No quiero dibujar una imagen de tikz basada en los datos cargados desde la tabla pgf. ¿Puedo usarlo de alguna manera como estándar \foreach
?
\foreach \i/\j in {\mytable}
\draw...
Lo que encontré es \pgfplotstableforeachcolumn
que se itera en una dimensión incorrecta y convierte la columna en una sola.
Estaba pensando en componer la tabla \pgfplotstabletypeset
, pero parece que no hay forma de eliminar el entorno tabular.
¿Hay alguna forma ya preparada para iterar sobre pgfplotstable? ¿Hay alguna forma de componerlo en el formato requerido por tikz foreach?
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
1 2
2 3
}\loadedtable
% Should behave like this:
\begin{tikzpicture}
\foreach \i/\j \in {1/2,2/3}
\draw (0,0) -- (\i,\j);
\end{tikpicture}
% and look like this
\begin{tikzpicture}
\magic_pgf_tables_foreach \i/\j \in \loadedtable
\draw (0,0) -- (\i,\j);
\end{tikpicture}
% or this
\begin{tikzpicture}
\foreach \i/\j \in {\magic_pgftable2\loadedtable}
\draw (0,0) -- (\i,\j);
\end{tikpicture}
\end{document}
Respuesta1
Puedes sacar elementos individuales usando \pgfplotstablegetelem
.
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
x y
1 2
2 3
}\loadedtable
% and look like this
\begin{tikzpicture}
\foreach \row in {0,1} {
\pgfplotstablegetelem{\row}{x}\of\loadedtable
\let\x=\pgfplotsretval
\pgfplotstablegetelem{\row}{y}\of\loadedtable
\let\y=\pgfplotsretval
\draw (0,0) -- (\x,\y);
}
\end{tikzpicture}
\end{document}
Respuesta2
Después de probar un poco, se me ocurrió una solución que aún deja mucho margen de mejora. Por ejemplo, no sé cómo indicar pgfplots
el uso de cycle list
para colorear las líneas; además, los límites de los ejes deben configurarse manualmente en este momento. En este caso sería más práctica una determinación automatizada.
Sin embargo, no quiero ocultarle mi idea, tal vez esto ya sea suficiente para sus necesidades.
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{csvsimple}
\pgfplotsset{compat = 1.17}
\begin{document}
\begin{filecontents*}{data.csv}
x,y
1,2
2,3
3,4
4,5
\end{filecontents*}
\begin{tikzpicture}
\begin{axis}[%
xmin = 0,
xmax = 4,
ymin = 0,
ymax = 5,
enlargelimits%
]
\pgfplotsextra{
\csvreader{data.csv}%
{x = \x, y = \y}%
{%
\pgfpathmoveto{\pgfplotspointaxisxy{0}{0}}
\pgfpathlineto{\pgfplotspointaxisxy{\x}{\y}}
\pgfusepath{stroke}
}
}
\end{axis}
\end{tikzpicture}
\end{document}
Editar
Ahora he pasado más tiempo con este interesante problema y finalmente he podido solucionar todos los problemas mencionados anteriormente.
El csvsimple
paquete facilita la lectura de archivos .csv y, con el \csvloop
comando, es posible ejecutar fácilmente un comando para cada línea del archivo. Entonces creé un comando que agrega su contenido a una lista cada vez que se llama. Este comando se utiliza \csvloop
y genera una lista con todas las coordenadas.
Dentro del entorno, ahora se puede usar axis
un comando para leer las coordenadas de la lista y agregar un gráfico desde hasta para cada coordenada.\foreach
(0,0)
(x,y)
\documentclass{article}
% Packages
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{csvsimple}
\usepackage{etoolbox}
% Package settings
\pgfplotsset{compat = 1.17}
% Define custom macros to parse the table content into a list
\newcommand{\coordinates}{}
\newcommand{\coordinate}[1]{%
\ifdefempty{\coordinates}
{\xappto\coordinates{#1}}
{\xappto\coordinates{,#1}}
}
% Load demo .csv file
\begin{filecontents*}{mydata.csv}
x,y
1,2
2,3
3,4
4,5
\end{filecontents*}
\begin{document}
% Read the table and parse it to a list
\csvloop{%
file = {mydata.csv},%
column names = {x=\x, y=\y},%
command = \coordinate{\x/\y}%
}
\begin{tikzpicture}
\begin{axis}[%
enlargelimits%
]
\foreach \x/\y in \coordinates {
\addplot+[mark = none] coordinates {
(0,0) (\x,\y)
};
}
\end{axis}
\end{tikzpicture}
\end{document}