如何使用 pgfplots 绘制带箭头的狄拉克三角洲

如何使用 pgfplots 绘制带箭头的狄拉克三角洲

我想在 pgfplots 中绘制这个:

三角洲

我已尝试过此方法,但我不知道如何获取箭头。

\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[ xlabel=$x$, ylabel=$y$, axis x line=center, axis y line = center, 
  xmin=-3.5, xmax=3.5, ymin=-1.5, ymax=1.5]
    \addplot+[ycomb,mark=triangle] plot coordinates {(-3,1) (3,-1)};
  \end{axis}
\end{tikzpicture}

\end{document}

pgf 增量

答案1

只需更换

\addplot+[ycomb,mark=triangle] plot coordinates {(-3,1) (3,-1)};

\draw[-latex,blue] (axis cs:3,0) -- (axis cs:3,1);
\draw[-latex,blue] (axis cs:-3,0) -- (axis cs:-3,1);

正如您在手册第 187 页所读到的,pgfplots您可以使用访问轴坐标系统axis cs,这允许您将(我认为)每个 TikZ 代码放入图片中。如果您只需要绘制垂直线(如狄拉克的增量),您可以使用命令\addplot但划分正增量和负增量:

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ xlabel=$x$, ylabel=$y$, axis x line=center, axis y line = center, xmin=-3.5, xmax=3.5, ymin=-1.5, ymax=1.5]
\addplot+[ycomb,mark=triangle,mark options={rotate=180}] plot coordinates {(3,-1) (2,-0.5)};
\addplot+[ycomb,mark=triangle,mark options={rotate=0}] plot coordinates {(-3,1) (-2,0.5)};
\draw[->] (axis cs:3,0) -- (axis cs:3,1);
\end{axis}
\end{tikzpicture}
\end{document}

答案2

如果您需要更精细地控制绘图标记(如本例所示),scatter除了 之外,您还可以使用 样式ycomb。通过启用scatter,可以使用名为 的新钩子scatter/@pre marker code,它允许您在绘制每个标记之前执行代码。

该选项visualization depends on允许您对当前绘图坐标执行数学运算并将结果存储在宏中。我在下面的示例中使用它来确定 y 坐标的符号。然后使用此符号@pre marker code仅旋转具有负 y 坐标的箭头。

正如 Spike 在评论中指出的那样,三角形超出了线的范围。这是因为标记始终以坐标为中心。快速修复此问题的方法是在命令yshift=-2pt后添加rotate

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{
    dirac/.style={
        mark=triangle*,
        mark options={scale=2},
        ycomb,
        scatter,
        visualization depends on={y/abs(y)-1 \as \sign},
        scatter/@pre marker code/.code={\scope[rotate=90*\sign,yshift=-2pt]}
    }
}

\begin{document}
\begin{tikzpicture}
\makeatletter
\begin{axis}[axis lines=middle,xmin=-3,xmax=3,ymin=-2,ymax=2,grid=both]
\addplot +[dirac] coordinates {(-2,1) (1,-1)};
\end{axis}
\end{tikzpicture}
\end{document}

散射魔法

答案3

另一个具有可变数量坐标的 PSTricks 解决方案:

\documentclass{article}
\usepackage{pst-plot}
\makeatletter
\def\psDirac{\pst@object{psDirac}}
\def\psDirac@i(#1,#2){\use@par\psline(#1,0)(#1,#2)%
  \@ifnextchar({\psDirac@i}{}}
\makeatother
\begin{document}

\begin{pspicture}[showgrid](-3,-2.25)(3,2.25)
\psaxes[labels=none]{->}(0,0)(-3,-2)(3,2)[$t$,0][$f(t)$,90]
\psDirac[arrows=->,arrowscale=1.5,arrowinset=0,
         linewidth=1.5pt,linecolor=blue](2.1,1)(2.5,-1)(-2,-1)(1,1)
\end{pspicture}

\end{document}

在此处输入图片描述

答案4

使用 PSTricks。只是为了完整性。它还可以接受无限数量的点。

在此处输入图片描述

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot,pst-node}

\makeatletter
\newcommand\psdirac[1][]{\getnodelist{ps@dirac@name}{\ps@dirac[#1]}}
\def\ps@dirac[#1]{{%
    \psset{#1}%
    \multido{\i=0+1}{\the\numexpr\pst@args+1\relax}{%
    \psline(\PST@root\i|0,0)(\PST@root\i)
    }}}
\makeatother

\psset{arrows=->}
\def\dirac(#1,#2){\psline(#1,0)(#1,#2)}

\begin{document}
\begin{pspicture}(-1,-3)(5,4)
    \psaxes(0,0)(-1,-3)(4.5,3.5)[$t$,0][$f(t)$,90]
    \psdirac[linecolor=blue,linewidth=2\pslinewidth](0.5,-1)(2,3)(3.5,-2.5)
\end{pspicture}
\end{document}

警告:

我不明白为什么\PST@root使用大写字母而\pst@args不用。这是一个很好的命名约定。:-)

相关内容