
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 é \pgfplotstableforeachcolumn
que 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 pgfplots
para cycle list
colorir 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}
Editar
Já passei mais algum tempo com esse problema interessante e finalmente consegui corrigir todos os problemas mencionados acima.
O csvsimple
pacote facilita a leitura de arquivos .csv e com o \csvloop
comando é 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 \csvloop
e gera uma lista com todas as coordenadas.
Dentro do axis
ambiente, um \foreach
comando 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}