Цикл по строкам pgfplotstable

Цикл по строкам pgfplotstable

Я не хочу рисовать картинку tikz на основе данных, загруженных из таблицы pgf. Могу ли я как-то использовать ее как стандартную \foreach?

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

Я обнаружил, \pgfplotstableforeachcolumnчто он выполняет итерацию в неправильном измерении и делает столбец одним.

Я думал о том, чтобы набрать таблицу, \pgfplotstabletypesetно, похоже, избавиться от табличной среды в ней не получится.

Есть ли готовые способы перебрать pgfplotstable? Есть ли способ оформить его в формате, требуемом 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}

решение1

Вы можете извлечь отдельные элементы, используя \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}

решение2

После некоторых манипуляций я придумал решение, которое все еще оставляет много места для улучшения. Например, я не знаю, как указать, pgfplotsчтобы использовать cycle listдля окраски линий, кроме того, границы осей должны быть установлены вручную в данный момент. Здесь автоматизированное определение было бы более практичным.

Тем не менее, я не хочу скрывать от вас свою идею, возможно, этого уже достаточно для ваших нужд.

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

введите описание изображения здесь

Редактировать

Теперь я потратил еще немного времени на решение этой захватывающей проблемы и наконец-то смог исправить все упомянутые выше неполадки.

Пакет csvsimpleупрощает чтение файлов .csv, а с помощью команды \csvloopможно легко выполнить команду для каждой строки файла. Поэтому я создал команду, которая добавляет свое содержимое в список каждый раз, когда ее вызывают. Эта команда используется в \csvloopи генерирует список со всеми координатами.

В среде axis-environment \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}

введите описание изображения здесь

Связанный контент