我想在 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}
答案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
不用。这是一个很好的命名约定。:-)