我在一个文件(名为 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 绘制数据。假设您想使用 Ti钾Z 和命令\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}
(结果和土拨鼠的图像完全相同,无需添加两次)。