我有以下代码来绘制分段线性函数并标记它。
\begin{tikzpicture}[
declare function={
func(\x)= (\x<=4) * (50) +
and (\x>=4, \x<7) * (49.999 - 2*(\x-4)) +
and (\x>=7, \x<=10) * (42-10*(\x-7)) ;
}
] \begin{axis}[ticks=none,
axis x line=middle, axis y line=middle,
ymin=20, ymax=60, ytick={}, ylabel=$x_D(t)$,
xmin=0, xmax=12, xtick={}, xlabel=$t$,
]
\addplot[blue, domain=0:10]{func(x)};
\filldraw (38,380) circle (1pt) node [right,font=\tiny] {$(t_B, x_D $)};
\filldraw (67,325) circle (1pt) node [right,font=\tiny] {$(t_C, x_D^\prime$)};
\filldraw (92,83) circle (1pt) node [right,font=\tiny] {$(t_D, 0$)};
\end{axis}
\end{tikzpicture}
我有三个问题:
我没有得到三条漂亮的分段线性段,而是得到了前两条线之间的轻微倾斜。
坐标
filldraw
极难找到,我不得不反复试验——有没有办法将它们直接映射到实际的轴坐标?最后一个标签
$(t_D,0)$
放在里面,几乎看不见。
答案1
首先,绘制分段函数时,必须绘制函数两次在角点处,因为使用了两个不同的公式。例如,您在 处绘制了图x=4,5
。该图应该绘制在 处x=3.99,4.01
(或者在 处绘制两次,使用不同的公式)。所以我修改了代码,使用选项手动放置样本samples at
。
同样,在此代码中,如果样本恰好位于 4 上,则两个公式都会执行。您可能应该将其中一个不等式更改为严格不等式(就像您对 7 所做的那样)。
此外,公式本身也存在一些连续性问题(除非是故意的)。我也纠正了这个问题。始终评估并查看角点处左公式和右公式的值是否匹配(如果您想要分段连续的功能)。
为了在角落放置标签,我使用了轴坐标系axis cs
。此选项使用轴来定义坐标,而不是默认的 tikz 坐标。
注意最后一个标签消失的问题目前已通过更改ymin
选项修复。可能有更好的方法。
\documentclass[]{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[
declare function={
func(\x)= (\x<=4) * (50) +
and (\x>=4, \x<7) * (50 - 2*(\x-4)) +
and (\x>=7, \x<=10) * (44-10*(\x-7)) ;
}
] \begin{axis}[ticks=none,
axis x line=middle, axis y line=middle,
ymin=14, ymax=60, ytick={}, ylabel=$x_D(t)$,
xmin=0, xmax=12, xtick={}, xlabel=$t$,
]
\addplot[blue, samples at ={0,1,2,3,3.99,
4.01, 6.99, 7.01, 10}
]{func(x)};
\filldraw (axis cs: 4,50) circle (1pt) node [right,font=\tiny] {$(t_B, x_D $)};
\filldraw (axis cs: 7,44) circle (1pt) node [right,font=\tiny] {$(t_C, x_D^\prime$)};
\filldraw (axis cs: 10,14) circle (1pt) node
[above, anchor=south west, font=\tiny] {$(t_D, 0$)};
\end{axis}
\end{tikzpicture}
\end{document}