我有 2 个包含多个条目的独立数据文件,如下所示:
File1.dat File2.dat
x1 y1 z1 x2 y2 z2
x1 y1 z1 x2 y2 z2
... ...
x1 y1 z1 x2 y2 z2
有没有办法绘制从文件 1 的第 1 行中的点 (x1 y1 z1) 到文件 2 的第 1 行中的点 (x2 y2 z2) 的所有条目的 3D 矢量?我猜这叫做箭筒图
答案1
您可以quiver
使用来自单个文件的数据绘制图表
\documentclass[tikz]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.16}
\begin{filecontents*}{data.txt}
x y z u v w
0 1 2 3 4 5
1 2 3 4 5 0
2 3 4 5 0 1
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
]
\addplot3 [blue,-stealth,samples=10,quiver,quiver/.cd,u=\thisrow{u},v=\thisrow{v},w=\thisrow{w}] table {data.txt};
\end{axis}
\end{tikzpicture}
\end{document}
因此,我猜想实现这一目标的一种方法是在绘图之前将这两个文件收集在一起。
编辑这是一个起点,可以帮助将两个数据集合并到一个表中,使用pgfplotstable
,构建表格有效,但绘图无效。我必须弄清楚为什么
\documentclass[]{article}
\usepackage{filecontents}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.16}
\usepackage{pgfplotstable}
\begin{filecontents*}{dataxyz.txt}
x y z
0 1 2
1 2 3
2 3 4
\end{filecontents*}
\begin{filecontents*}{datauvw.txt}
u v w
3 4 5
4 5 0
5 0 1
\end{filecontents*}
\begin{document}
% loads dataxyz.txt into \outputxyz
\pgfplotstableread{dataxyz.txt}{\outputxyz}
% transposes \outputxyz
\pgfplotstabletranspose[input colnames to={}]{\outputxyz}{\outputxyz}
% concatenates \outputxyz to \output
\pgfplotstablevertcat{\output}{\outputxyz}
% loads datauvw.txt into \outputuvw
\pgfplotstableread{datauvw.txt}{\outputuvw}
% transposes \outputuvw
\pgfplotstabletranspose[input colnames to={}]{\outputuvw}{\outputuvw}
% concatenates \outputuvw to \output
\pgfplotstablevertcat{\output}{\outputuvw}
% transposes output
\pgfplotstabletranspose[input colnames to={}]{\output}{\output}
% display output
%\pgfplotstabletypeset[string type]\outputxyz
%\pgfplotstabletypeset[string type]\outputuvw
%\pgfplotstabletypeset[string type]\output
% Working plot
\begin{tikzpicture}
\begin{axis}[]
\addplot3 [blue,-stealth,quiver,quiver/.cd,u=\thisrow{3},v=\thisrow{4},w=\thisrow{5}] table[] {\output};
\end{axis}
\end{tikzpicture}
\end{document}
编辑2 经过最大限度
在我的初步评论我指出,当input colnames to={}
对所有转置操作使用选项时,绘图会起作用,但这样会丢失列名。如果您使用colnames from=colnames
和input colnames to={}
仅有的对于最后的转置,列名被保留,并且可以绘制图表,就好像两个表在一个文件中一样。
\documentclass[]{article}
\usepackage{filecontents}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.16}
\usepackage{pgfplotstable}
\begin{filecontents*}{dataxyz.txt}
x y z
0 1 2
1 2 3
2 3 4
\end{filecontents*}
\begin{filecontents*}{datauvw.txt}
u v w
3 4 5
4 5 0
5 0 1
\end{filecontents*}
\begin{document}
% loads dataxyz.txt into \outputxyz
\pgfplotstableread{dataxyz.txt}{\outputxyz}
% transposes \outputxyz
\pgfplotstabletranspose{\outputxyzT}{\outputxyz}
% concatenates \outputxyz to \output
\pgfplotstablevertcat{\outputT}{\outputxyzT}
% loads datauvw.txt into \outputuvw
\pgfplotstableread{datauvw.txt}{\outputuvw}
% transposes \outputuvw
\pgfplotstabletranspose{\outputuvwT}{\outputuvw}
% concatenates \outputuvw to \output
\pgfplotstablevertcat{\outputT}{\outputuvwT}
% transposes output
\pgfplotstabletranspose[colnames from=colnames,input colnames to={}]{\output}{\outputT}
\begin{tabular}{rr}
As read xyz: & \mbox{\pgfplotstabletypeset[string type]\outputxyz} \\[1cm]
Transposed xyz: & \mbox{\pgfplotstabletypeset[string type]\outputxyzT} \\[1cm]
As read uvw: & \mbox{\pgfplotstabletypeset[string type]\outputuvw} \\[1cm]
Transposed uvw: & \mbox{\pgfplotstabletypeset[string type]\outputuvwT} \\[1cm]
Concatenation: & \mbox{\pgfplotstabletypeset[string type]\outputT} \\[1cm]
Final: & \mbox{\pgfplotstabletypeset[string type]\output} \\[1cm]
\end{tabular}
% Working plot
\begin{tikzpicture}
\begin{axis}[xlabel=x,ylabel=y,grid=both]
\addplot3 +[
blue,
-stealth,
% x=\thisrow{x},
% y=\thisrow{y},
% z=\thisrow{z},
quiver,
quiver/.cd,
u=\thisrow{u},
v=\thisrow{v},
w=\thisrow{w}
] table {\output};
\end{axis}
\end{tikzpicture}
\end{document}
这导致
情节是
编辑3 经过最大限度
进行一些小小的编辑来展示如何使用它从(x1,y1,z1)
到进行绘制(x2,y2,z2)
,并提供一些非常简单的示例坐标:
u
重要的变化是坐标的命名方式与您的问题相同,并且、v
和的表达式w
更改为:
u={\thisrow{x2}-\thisrow{x1}},
v={\thisrow{y2}-\thisrow{y1}},
w={\thisrow{z2}-\thisrow{z1}},
完成 MWE:
\documentclass[]{article}
\usepackage{filecontents}
\usepackage{pgfplots}
\pgfplotsset{width=6cm,compat=1.16}
\usepackage{pgfplotstable}
\begin{filecontents*}{dataxyz.txt}
x1 y1 z1
1 0 0
0 1 0
0 0 1
\end{filecontents*}
\begin{filecontents*}{datauvw.txt}
x2 y2 z2
1 0 1
0 1 1
1 1 1
\end{filecontents*}
\begin{document}
% loads dataxyz.txt into \outputxyz
\pgfplotstableread{dataxyz.txt}{\outputxyz}
% transposes \outputxyz
\pgfplotstabletranspose{\outputxyzT}{\outputxyz}
% concatenates \outputxyz to \output
\pgfplotstablevertcat{\outputT}{\outputxyzT}
% loads datauvw.txt into \outputuvw
\pgfplotstableread{datauvw.txt}{\outputuvw}
% transposes \outputuvw
\pgfplotstabletranspose{\outputuvwT}{\outputuvw}
% concatenates \outputuvw to \output
\pgfplotstablevertcat{\outputT}{\outputuvwT}
% transposes output
\pgfplotstabletranspose[colnames from=colnames,input colnames to={}]{\output}{\outputT}
% Working plot
\begin{tikzpicture}
\begin{axis}[xlabel=x,ylabel=y,zlabel=z,grid=both]
\addplot3 +[
blue,
-stealth,
x=\thisrow{x1},
y=\thisrow{y1},
z=\thisrow{z1},
quiver,
quiver/.cd,
u={\thisrow{x2}-\thisrow{x1}},
v={\thisrow{y2}-\thisrow{y1}},
w={\thisrow{z2}-\thisrow{z1}},
] table {\output};
\end{axis}
\end{tikzpicture}
\end{document}