绘制能量级联图

绘制能量级联图

我想要绘制如下的能量级联图:

在此处输入图片描述

我只是假设第一部分是一个等于 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}

情节如下: 在此处输入图片描述 编辑:删除了不必要的 y 轴刻度标签。

相关内容