考虑以下代码:
\documentclass{standalone}
\usepackage{tikz,pgfplots,siunitx}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
%% 1st and 2nd waveforms
\begin{axis}[
scale only axis,
axis y line*=left,
axis x line*=bottom,
xlabel={Time [\si{s}]},
ylabel={Current [\si{\A}]},
grid=major
]
\addplot [blue, line width = 1, smooth]
table[x=t,y=ch1,col sep=comma]{myDataFile.csv};
\addplot [green, line width = 1, smooth]
table[x=t,y=ch2,col sep=comma]{myDataFile.csv};
\end{axis}
%% Here starts the 3rd waveform
\begin{axis}[
scale only axis,
axis y line*=right,
axis x line*=bottom,
xlabel={Time [\si{s}]},
ylabel={Voltage (Normalised)}
%grid=major
]
\addplot [red, line width = 1, smooth]
table[x=t,y=ch3,col sep=comma]{myDataFile.csv};
\end{axis}
\end{tikzpicture}
\end{document}
该myDataFile.csv
文件内容如下:
%myDataFile.csv%
t,ch1,ch2,ch3
-4,-2,0.0625,0.756
-3,-1.5,0.125,-0.141
-2,-1,0.25,-0.909
-1,-0.5,0.5,-0.841
0,0,1,0
1,0.5,2,0.841
2,1,4,0.909
3,1.5,8,0.141
4,2,16,-0.758
事实是,第三个波形被平移(向上约 6 个单位)并且被拉伸,因此它延伸了由ch1
或 的最小值(两者中较小的一个)和或 的ch2
最大值(两者中较大的一个)决定的整个垂直跨度。ch1
ch2
在上面的例子中,ch3
(红色)是从 t=-4 到 t=+4 绘制的正弦函数,因此它在垂直方向上的范围是 -1 到 1。如您所见,它绘制得不正确。(ch1
是y=-t/2
,并且ch2
是2^t
)
我正在关注代码这答案,关于在一个“画布”上绘制两个函数。
从我在该链接答案的内嵌图片中看到的情况来看,同样的效果也适用于那里。
我怎样才能避免这种情况并按ch3
原样进行绘制?
为了阐明我的观点,我想要一些如下所示的东西(绘制在德斯莫斯):
请注意,与曲线相比,正弦波在垂直方向上的跨度如何2^t
。它实际上是从 -1 到 +1,其“x 轴”与其他两条曲线的 x 轴重合。但是,它描述的是不同的物理量,因此“值得”使用不同的标签和刻度,绘制在右边缘。
此外,我如何指示pgfplots
将其在垂直方向上拉伸,例如,每个值输入拉伸 2 倍?我找到了一个问题关于缩放数据集,但我不知道如何对从文件导入的数据进行缩放,csv
就像这里的情况一样。
答案1
您需要将两个轴的 y 限值设置为相同的值,因此添加ymin=-4, ymax=17
。有几种方法可以做到这一点,您可以将其分别添加到两个轴,您可以执行\pgfplotsset{common axis settings/.style={ymin=-4, ymax=17}}
然后添加common axis settings
到两个axis
选项,或者简单地在 和\pgfplotsset{ymin=-4, ymax=17}
之间添加\begin{tikzpicture}
第一个\begin{axis}
。
我可能会删除smooth
,它将在采样点之间使用贝塞尔曲线而不是直线,以及第二个轴的 x 刻度和标签(当前是重复的)。
正如评论中所提到的,您可以使用 Jake 在您所链接的答案中描述的缩放图的方法,我也在下面的代码中演示了这一点。
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots,siunitx}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{
ymin=-4,
ymax=17,
every axis plot/.append style={
line width = 1,
% if you want to add markers as in the Desmos plot, uncomment this
% mark=*,
% mark size=2
}
}
%% 1st and 2nd waveforms
\begin{axis}[
scale only axis,
axis y line*=left,
axis x line*=bottom,
xlabel={Time [\si{s}]},
ylabel={Current [\si{\A}]},
grid=major
]
\addplot [blue] table[x=t,y=ch1,col sep=comma] {myDataFile.csv};
\addplot [green] table[x=t,y=ch2,col sep=comma] {myDataFile.csv};
\end{axis}
%% Here starts the 3rd waveform
\begin{axis}[
scale only axis,
axis y line*=right,
axis x line*=bottom,
xtick=\empty,
% xlabel={Time [\si{s}]},
ylabel={Voltage (Normalised)},
ylabel style={red}
]
\addplot [red] table[x=t,y=ch3,col sep=comma] {myDataFile.csv};
\addplot [red, densely dashed] table[x=t,y expr=\thisrow{ch3}*2,col sep=comma] {myDataFile.csv};
\end{axis}
\end{tikzpicture}
\end{document}