
Я не хочу рисовать картинку 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}