使用数据文件作为 tikz 的输入

使用数据文件作为 tikz 的输入

我在一个文件(名为 data.dat)中有一个已排序的数据。这些数据应该垂直绘制。我使用 tikz 在 latex 中准备了一个可以运行的代码。问题是每个数据都在代码主体中逐个输入,我需要一种方法来调用数据文件并逐个替换每个数据。这是我的代码

\documentclass[border= 5 pt]{standalone} 
\usepackage{times,comment}
\usepackage{graphicx}
\usepackage{tikz}


\newcommand{\point}[1]{
\draw [<->,purple] ( 0 , #1 ) node[yshift=0,left,font=\tiny]{  #1 }  -- ( 1 , #1 ) node[yshift=0,right,font=\tiny]{  #1 } ; }

\begin{document}

\begin{tikzpicture}[scale=1]
\point{0}    
\point{1}
\point{2}
\point{2.5}    
\point{3.4}
\point{4}
\point{5.8}
\point{6.9}
\point{7.5}

\end{tikzpicture}

\end{document}

数据文件可以从这里。

答案1

正如 Henri Menke 指出的那样,您可以使用 pgfplots 绘制数据。假设您想使用 TiZ 和命令\point,您可以用来pgfplotstable加载和循环数据。(您不需要\begin{filecontents*}{data.dat}...\end{filecontents*}因为您已经有了data.dat,这只是为了让其他人更方便地在他们的系统上获取文件。)

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{data.dat}
0
1
2
2.5
3.4
4
5.8
6.9
7.5
\end{filecontents*}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
% from https://tex.stackexchange.com/a/445369/121799
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{#3}\of{#1}%
    \let#4\pgfplotsretval
}
\newcommand{\point}[1]{
\draw [<->,purple] ( 0 , #1 ) node[yshift=0,left,font=\tiny]{  #1 }  -- ( 1 , #1 ) node[yshift=0,right,font=\tiny]{  #1 } ; }

\begin{document}

\begin{tikzpicture}[scale=1]
\pgfplotstableread[header=false]{data.dat}\datatable
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\rownum}{\pgfplotsretval-1}
\foreach \X in {0,...,\rownum}
{\ReadOutElement{\datatable}{\X}{[index]0}{\tmpx}
\point{\tmpx}
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

虽然在这种情况下您可以使用 pgfplots 来加载外部数据 (+1),并且在其他类型的宏中您可能也可以使用包datatool,但如果您了解 R 和knitr,这里是另一种方法可以访问单个值作为宏的参数:将外部数据加载为 R 数据框对象,用名称“数据”表示,然后访问该向量的具体值 \Sexpr{data[3,1]}(打印第一列的第三个值)。

要将外部 CSV 文件加载为数据框,您可以使用read.csv()R 函数,但在本示例中,我从头开始创建了数据框:

\documentclass{article} 
\usepackage{times,comment}
\usepackage{graphicx}
\usepackage{tikz}
\newcommand{\point}[1]{
\draw [<->,purple] ( 0 , #1 ) node[yshift=0,left,
font=\tiny]{  #1 }  -- ( 1 , #1 ) node[yshift=0,right,font=\tiny]{  #1 } ; }
\begin{document}
<<mydata,echo=F>>=
# data <- read.csv("data.dat", sep=",", header=F) # to load external data
data <- data.frame(x=c(0,1,2,2.5,3.4,4,5.8,6.9,7.5)) # internal data
@
\begin{tikzpicture}[scale=1]
\point{\Sexpr{data[1,1]}}    
\point{\Sexpr{data[2,1]}}    
\point{\Sexpr{data[3,1]}}    
\point{\Sexpr{data[4,1]}}    
\point{\Sexpr{data[5,1]}}    
\point{\Sexpr{data[6,1]}}    
\point{\Sexpr{data[7,1]}}    
\point{\Sexpr{data[8,1]}}    
\point{\Sexpr{data[9,1]}}    
\end{tikzpicture}
\end{document}

(结果和土拨鼠的图像完全相同,无需添加两次)。

相关内容