假设我有一堆数据,如下所示:
1,15,53
5,74,12
74,23,66
我如何存储数据其实并不重要。我可以将其以文本形式放入我的 .tex 文件中,也可以将其存储在外部 .csv 文件中。
现在,我想在我的 tikz 代码中获取单个数据点。例如,假设我想使用第 2 行、第 0 列的数据点(在本例中为数字74
)。我的代码将如下所示:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[draw] at (0,\dataPointAtRow2Column0) {test};
\end{tikzpicture}
我可以写一些东西来代替\dataPointAtRow2Column0
让 tikz 在(0,74)处绘制一个节点吗?
请注意,我不是在寻找类似的解决方案这。我不想使用重写我的代码\pgfplots
。
答案1
一种可能的方法是使用pgfplotstable
宏\pgfplotstablegetelem
\documentclass[border=2mm]{standalone}
\usepackage{pgfplotstable}
\pgfplotstableread[col sep=comma]{
1,15,53
5,74,12
74,23,66
}\mydata
\begin{document}
\begin{tikzpicture}
\node (o) at (0,0) {O};
\pgfplotstablegetelem{2}{0}\of\mydata
\node[draw] at (0,\pgfplotsretval pt) {test};
\end{tikzpicture}
\end{document}
答案2
只要宏仅使用扩展,它就可以用作坐标:
\documentclass{article}
\usepackage{tikz}
\def\data{
{1,15,53}
{5,74,12}
{74,23,66}
}
\makeatletter
\def\dataPointAt#1#2{\expandafter\xdpa\data{}{}\relax{#1}{#2}}
\def\xdpa#1#2\relax#3#4{%
\ifnum#3>\z@
\xdpa#2\relax{\numexpr#3-1\relax}{#4}%
\else
\xxpda#1,\relax{#4}%
\fi}
\def\xxpda#1,#2\relax#3{%
\ifnum#3>\z@
\xxdpa#2\relax{\numexpr#3-1\relax}%
\else
#1%
\fi}
\makeatother
\typeout{===\dataPointAt{2}{0}===}
\makeatother
\begin{document}
\begin{tikzpicture}
\node[draw] at (0, \dataPointAt{2}{0}) {test};
\end{tikzpicture}
\end{document}