很简单的办法参考自: https://ask.latexstudio.net/ask/question/8198.html
对于这种分段函数,直接使用tikz用直线绘制即可,你甚至可以很方便的控制颜色,线条样式、粗细等特征:
\documentclass[tikz,border=5pt]{standalone}
\usepackage[fontset=fandol]{ctex}
\usepackage[osf]{libertine} % 我喜欢的一款字体
\begin{document}
\begin{tikzpicture}[
line cap=round,
every node/.style={black}
]
\draw[-latex] (0,0) -- (6,0) node[below]{t(h)};
\draw[-latex] (0,0) -- (0,6) node[right]{s(km)};
\node[below left] {0};
\foreach \i in {1,...,5}{
\draw(0,\i) node[left] {\inteval{10*\i}} -- ++(.2,0);
\draw(\i,0) node[below] {\inteval{\i}} -- ++(0,.2);
}
\draw[magenta,thick] (0,0)
-- (1,3) node[left] {A}
-- (1.5,3) node[right] {B}
-- (2,5) node[above left=-1pt] {C}
-- (2.75,5) node[above right=-1pt] {D}
-- (5,0) node[above right=-1pt] {E}
;
\draw[cyan,dashed,semithick] (0,5)
-- (.5,5) node[above] {G}
-- (3,0) node[above right] {H}
;
\draw[cyan,dashed,semithick] (5.75,5.25) -- ++(-1,0) node[left,anchor=east] {小聪};
\draw[magenta,thick] (5.75,4.5) -- ++(-1,0) node[left,anchor=east] {小慧};
\end{tikzpicture}
\end{document}
当然,这里有个小难点是如何恰好让「B」点相交,我是做了一些斜率的预计算。放轻松,每一行命令的功能都是比较简单的,你可以注释某行代码再编编译看看结果,相信学会这种绘制并不算太难~
Happy TikZing!
tikz的一些直线命令就可以完成,tikz中应该有些库或者模块专门画函数图像,不过不一定方便。详细可以看pgfmanual. 如果你经常需要画图,这个手册中的一些内容最好学一下,特别是第三部分和第五部分。
基于 asymptote 的一个方案(仅作为练习,这张图应该更适合 pgfplot 这种可以通过数据绘图的宏包,下面 IgnoreAspect 其实也可以在 tikz 找到对应的方案的,使用 scale 等等 ):

完整代码如下:
/*======== 设置(Set) =========*/
settings.outformat="pdf";
settings.tex="xelatex"; usepackage("ctex","fontset=fandol");
size(7cm,6cm,IgnoreAspect); arrowbar cAr=Arrow(5);
pen cdotted=linetype(new real[] {0,3});
/*======== 定义(Define) =========*/
pair O=(0,0),A=(1,30),B=(1.5,30),C=(2,50),D=(3,50),F=(5,0);
pair G=(0.5,50),H=(3,0);
path cong=(0,50)--G--H;
path hui=O--A--B--C--D--F--H;
/*======== 绘制(Draw) =========*/
draw(cong,cdotted); draw(hui);
draw(Label("\small$t(\mathrm{h})$",Relative(1),S),(0,0)--(6.5,0),cAr);
draw(Label("\small$s(\mathrm{km})$",Relative(1),E),(0,0)--(0,60),cAr);
draw(Label("\small 小聪",W),(5,55)--(6.5,55),cdotted);
draw(Label("\small 小慧",W),(5,45)--(6.5,45));
/*======== 标注(Label) =========*/
for (real t=1; t<=5; t+=1) {
draw((t,0)--(t,1.5));
label((string)t,(t,0),S);
}
for (real s=10; s<=50; s+=10) {
draw((0,s)--(0.25,s));
label((string)s,(0,s),W);
}
label("$O$",O,SW); label("$A$",A,W); label("$B$",B,E);
label("$C$",C,N); label("$D$",D,NE); label("$F$",F,NE);
label("$G$",G,N); label("$H$",H,NNE);
@u10189 欧几里得宏包 tkz-euclide 的最大优势是提供了便捷的命令来计算几何概念,例如角度,角平分线,中垂线,交点等等。如果一个图形中的几何概念较少,但是颜色,line type,line width 比较显眼,用这个宏包绘制就不太有优势。
图形是千变万化的,熟悉最基本的命令和要素才能以不变应万变。
嗯,这里并没有太多角平分线、中垂线一类的几何元素,用
tkz-euclide就不会太有优势了