Bucle sobre filas pgfplotstable

Bucle sobre filas pgfplotstable

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 \pgfplotstableforeachcolumnque 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 pgfplotsel uso de cycle listpara 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}

ingrese la descripción de la imagen aquí

Editar

Ahora he pasado más tiempo con este interesante problema y finalmente he podido solucionar todos los problemas mencionados anteriormente.

El csvsimplepaquete facilita la lectura de archivos .csv y, con el \csvloopcomando, 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 \csvloopy genera una lista con todas las coordenadas.

Dentro del entorno, ahora se puede usar axisun 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}

ingrese la descripción de la imagen aquí

información relacionada