我是一名机械工程专业的学生,我正在绘制以一定角度连接的两个连杆的变形。两个连杆的示意图如下所示
我想使用该包pgfplots
绘制链接的变形。现在我已经计算了两个链接在某些节点处的变形。假设两个链接的变形都是
\begin{filecontents*}{data1.tex}
0. 0.
0.1 0.00944826
0.2 0.0308185
0.3 0.0541806
0.4 0.0711639
0.5 0.0760562
0.6 0.0666065
0.7 0.0442508
0.8 0.0136516
0.9 -0.0183828
1. -0.0443726
\end{filecontents*}
其中第一列是沿连杆轴向的距离,第二列是横向变形。为了直观地显示变形,我想使用命令mesh
的选项\addplot
,通过设置根据变形为线条着色point meta=y
。此外,我想绘制相对于未变形配置的变形,如下所示。
我写的代码是
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\usepackage{filecontents}
\begin{filecontents*}{data.dat}
0. 0.
0.1 0.00944826
0.2 0.0308185
0.3 0.0541806
0.4 0.0711639
0.5 0.0760562
0.6 0.0666065
0.7 0.0442508
0.8 0.0136516
0.9 -0.0183828
1. -0.0443726
\end{filecontents*}
\pagestyle{empty}
\pgfplotsset{compat=1.16}
\begin{document}
\pgfplotstableread{data.dat}\data
\begin{tikzpicture}
\begin{axis}[
% hide axis,
colormap/jet,
point meta rel=per plot,
ymax=10
]
\addplot[
mesh,
point meta=abs(y),
] table {\data} coordinate (endpoint);
% the above command plots the deformation of the first link
\addplot[
mesh,
x filter/.code={\pgfmathparse{#1+1}\pgfmathresult},
y filter/.code={\pgfmathparse{#1+-0.0443726}\pgfmathresult},
rotate around={45:(1.,-0.0443726)},% works
%rotate around={45:(endpoint)},% not works
] table {\data};
\end{axis}
\end{tikzpicture}
\end{document}
上面代码中我用了x filter
和rotate around
来实现图的旋转和平移,需要手动修改旋转参数,如果变形的话好像比较麻烦,需要绘制很多个类似的图形。
我endpoint
在第一个 addplot 的末尾定义了一个坐标名称。如果我将坐标名称用作变量rotate around
(参见注释行),代码将不起作用。
我怎样才能修改代码以便只能更改文件名?
答案1
好问题!您的方法在原则上是可行的,但问题是pgfplots
启动调查阶段时坐标endpoint
未知。因此,我建议只从表中读取最后一个坐标(在启动之前axis
)并使用它。这与您的方法一样自动化。
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\usepackage{filecontents}
\begin{filecontents*}{data.dat}
0. 0.
0.1 0.00944826
0.2 0.0308185
0.3 0.0541806
0.4 0.0711639
0.5 0.0760562
0.6 0.0666065
0.7 0.0442508
0.8 0.0136516
0.9 -0.0183828
1. -0.0443726
\end{filecontents*}
\pagestyle{empty}
\pgfplotsset{compat=1.16}
\begin{document}
\pgfplotstableread{data.dat}\data
\pgfplotstablegetrowsof{\data}
\pgfmathtruncatemacro{\NumRows}{\pgfplotsretval-1}
\pgfplotstablegetelem{\NumRows}{[index]0}\of{\data}
\edef\myx{\pgfplotsretval}
\pgfplotstablegetelem{\NumRows}{[index]1}\of{\data}
\edef\myy{\pgfplotsretval}
\begin{tikzpicture}
\begin{axis}[
hide axis,
colormap/jet,
point meta rel=per plot,
ymax=10
]
\addplot[
mesh,
point meta=abs(y),
] table {\data};
\addplot[
mesh,
x filter/.code={\pgfmathparse{#1+1}\pgfmathresult},
y filter/.code={\pgfmathparse{#1+-0.0443726}\pgfmathresult},
rotate around={45:(\myx,\myy)},% works
] table {\data};
\end{axis}
\end{tikzpicture}
\end{document}