Loop sobre linhas pgfplotstable

Loop sobre linhas pgfplotstable

Não quero desenhar uma imagem tikz com base nos dados carregados da tabela pgf. Posso de alguma forma usá-lo como padrão \foreach?

\foreach \i/\j in {\mytable}
  \draw...

O que descobri é \pgfplotstableforeachcolumnque ele itera na dimensão errada e torna a coluna uma só.

Eu estava pensando em compor a tabela \pgfplotstabletypeset, mas parece que não há como se livrar dela do ambiente tabular.

Existe alguma maneira pronta de iterar sobre o pgfplotstable? Existe uma maneira de digitá-lo no formato exigido pelo 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}

Responder1

Você pode extrair elementos individuais 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}

Responder2

Depois de algumas brincadeiras, encontrei uma solução que ainda deixa muito espaço para melhorias. Por exemplo, não sei como instruir pgfplotspara cycle listcolorir as linhas, além disso, os limites dos eixos devem ser definidos manualmente no momento. Aqui, uma determinação automatizada seria mais prática.

No entanto, não quero negar-lhe a minha ideia, talvez isso já seja suficiente para as suas necessidades.

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

insira a descrição da imagem aqui

Editar

Já passei mais algum tempo com esse problema interessante e finalmente consegui corrigir todos os problemas mencionados acima.

O csvsimplepacote facilita a leitura de arquivos .csv e com o \csvloopcomando é facilmente possível executar um comando para cada linha do arquivo. Então criei um comando que anexa seu conteúdo a uma lista cada vez que é chamado. Este comando é usado \csvloope gera uma lista com todas as coordenadas.

Dentro do axisambiente, um \foreachcomando agora pode ser usado para ler as coordenadas da lista e adicionar um gráfico de (0,0)para (x,y)para cada coordenada.

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

insira a descrição da imagem aqui

informação relacionada