![绘制能量级联图](https://linux22.com/image/427021/%E7%BB%98%E5%88%B6%E8%83%BD%E9%87%8F%E7%BA%A7%E8%81%94%E5%9B%BE.png)
我想要绘制如下的能量级联图:
我只是假设第一部分是一个等于 4 的常数函数,第二部分和第三部分是具有不同斜率的线性函数。
我使用了以下代码:
\begin{tikzpicture}[
declare function={
func(\x)= (\x>=1) * (4)+
and(\x>1.5, \x<=4) * (-\x/2)+
and(\x>4, \x<=5) * (-\x);
}
]
\begin{axis}[
axis x line=middle, axis y line=middle,
ymin=0, ymax=5, ytick={0,...,5}, ylabel=$\log{E}$,
xmin=0, xmax=5, xtick={-5,...,5}, xlabel=$k$,
]
\pgfplotsinvokeforeach{1, 3, 4}{
\draw[dashed] ({rel axis cs: 0,0} -| {axis cs: #1, 0}) -- ({rel axis cs: 0,20} -| {axis cs: #1, 0});}
\addplot[blue]{func(x)};
\end{axis}
\end{tikzpicture}
但是输出给出了一条连续的曲线,而且我也无法用数学短语替换 xticks 数字。
我怎样才能绘制与第一张图相同的图?
答案1
您的绘图存在问题,因为您声明了函数。您有所需的斜率,但没有 y 截距点。此外,您需要许多样本才能使斜率的变化变得平滑。我宁愿将函数分成三个绘图或将其更改为某些坐标。
对于刻度标签,您需要xticklabels
命令。
下面是包含两个图的代码:一个是你修改后的图,另一个是不包含该函数的图。
\documentclass[border=2mm]{standalone}
\usepackage {pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
% OP code modified
\begin{tikzpicture}[
declare function={
func(\x) = (\x<=1) * (4) +
and(\x>1, \x<=4) * (-\x/2+4.5) +
(\x>4) * (-\x+6.5);
}
]
\begin{axis}
[
axis x line=middle, axis y line=middle, samples=101, domain=0.5:4.5,
ymin=0, ymax=5, ytick={0,...,5}, ylabel=$\log{E}$,
xmin=0, xmax=5, xtick={1,3,4}, xlabel=$k$,
xticklabels={$1/L$, $1/l$, $1/l_k$}, yticklabels={}
]
\pgfplotsinvokeforeach{1, 3, 4}
{
\addplot[red,dashed] coordinates {(#1,0) (#1,5)};
}
\addplot[blue]{func(x)};
\end{axis}
\end{tikzpicture}
% Suggested code
\begin{tikzpicture}
\begin{axis}
[
axis x line=middle, axis y line=middle,
ymin=0, ymax=5, ytick={0,...,5}, ylabel=$\log{E}$,
xmin=0, xmax=5, xtick={1,3,4}, xlabel=$k$,
xticklabels={$1/L$, $1/l$, $1/l_k$}, yticklabels={}
]
\pgfplotsinvokeforeach{1, 3, 4}
{
\addplot[red,dashed] coordinates {(#1,0) (#1,5)};
}
\addplot[blue] coordinates {(0.5,4) (1,4) (4,2.5) (4.5,2)};
\end{axis}
\end{tikzpicture}
\end{document}