我正在使用 TikZ 为文档绘制一些函数。例如,我想绘制 1/(x+1)。所以我做了这样的事情:
\begin{tikzpicture}[>=stealth,x=3mm,y=3mm]
\draw (0,5) node[above]{\fimg $y=f(x+1)=\dfrac{1}{x+1}$};
\clip (-5,-5) rectangle (5,5);
\ejes[1]{-4}{4}{-4}{4}
\draw[samples=100] plot(\x,{1/(\x+1)});
\end{tikzpicture}
其中\ejes[style]{xmin}{xmax}{ymin}{ymax}
是命令,我之前已经定义过它来绘制坐标轴(与 连接\fimg
)。我对以下代码的预期输出只是函数,但我得到了这个:
因此,TikZ 自动将垂直渐近线置于 x=-1 处。这不是一件坏事,但现在我想对其进行一些控制。例如,我想要垂直渐近线的虚线。我该怎么做?
答案1
TikZ 实际上并不绘制渐近线:它只是连接跳跃前后的两个点。由于使用了太多样本,因此您看不到该线实际上略微倾斜。
两个建议:对于绘图,我将使用 PGFplots 包,它大大扩展了 TikZ/PGF 的绘图功能。它允许您过滤掉高于或低于某个阈值的坐标,并在该点中断绘图线。对于绘制渐近线,我将使用普通\draw
命令。如果您使用 PGFplots,您可以根据“数据坐标系”和“轴坐标系”指定线条,这样您就可以绘制一条从绘图底部的指定水平坐标延伸到绘图顶部的垂直线。
我定义了一种新样式ejes=<xmin>:<xmax> <ymin>:<ymax>
,用于设置所有必需的参数并绘制轴,以及一个新命令\vasymptote{<xpos>}
,用于在所需位置绘制垂直虚线。它需要一个可选参数,该参数将传递给线条,因此您可以根据需要更改颜色、粗细或虚线图案。
使用样式和命令,你可以使用以下方法重新创建你的第一张图像
\tikz{\begin{axis}[ejes=-4:4 -4:4, title={$y=f(x+1)=\dfrac{1}{x+1}$}]
\addplot {1/(x+1)};
\vasymptote {-1}
\end{axis}}
这将产生
完整代码如下:
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{amsmath}
\begin{document}
\newcommand{\vasymptote}[2][]{
\draw [densely dashed,#1] ({rel axis cs:0,0} -| {axis cs:#2,0}) -- ({rel axis cs:0,1} -| {axis cs:#2,0});
}
\pgfplotsset{
double y domain/.code 2 args={
\pgfmathsetmacro\doubleymin{#1*2}
\pgfmathsetmacro\doubleymax{#2*2}
},
ejes/.style args={#1:#2 #3:#4}{
double y domain={#3}{#4},
domain=#1:#2,
ymin=#3,ymax=#4, restrict y to domain=\doubleymin:\doubleymax,
samples=100,
enlargelimits=false,
axis lines=middle,
xtick={#1,...,#2}, ytick={#3,...,#4},
xticklabels=\empty, yticklabels=\empty,
every axis plot post/.style={
black,
mark=none,
smooth
},
scale only axis,
width=4cm,
height=4cm
}
}
\tikz{\begin{axis}[ejes=-4:4 -4:4,title={$y=f(x+1)=\dfrac{1}{x+1}$}]
\addplot {1/(x+1)};
\vasymptote {-1}
\end{axis}}
\end{document}
答案2
使用 PSTricks。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\def\f(#1){1/(#1)}
\begin{document}
\begin{pspicture}(-4,-4)(2,4)
\psline[linecolor=gray,linestyle=dashed](-1,-4)(-1,3.5)
\psaxes{->}(0,0)(-4,-4)(1.5,3.5)[$x$,0][$y$,90]
\psset{algebraic,linecolor=blue}
\psplot{-3.5}{-1.3}{\f(x+1)}
\psplot{-0.7}{1}{\f(x+1)}
\end{pspicture}
\end{document}
编辑:
根据纺织爱好者以下,
我投了赞成票,因为我觉得你的答案和 Herbert 的答案不同,因为我不知道。最好提一下有什么不同。
不同之处如下:
- 我使用了默认值
plotpoints=50
。这应该足够了。增加此值会使生成的 PDF 文件大小更大。 - 我用渐近线作为分隔符将图分成两部分。我选择了 0.3 的偏移量(通过检查)来稍微移动域以避免
y
值过大。对于当前的 PSTricks 实现,渐近线附近的渐近图的端点会振荡。波动可以通过键控制plotpoints
。将其分成两部分并偏移域使我免于增加plotpoints
其默认值。Herbert 使用了一个\psplot
但带有plotpoints=1000
来最小化波动。因此,差异是悲观和乐观的方法。
答案3
绘制渐近线的另一种方法格努普特克斯带自动引擎盖的套件格努普特計算。
适用于:-shell-escape
启用和gnuplot 4.4
,
代码编译使用:Linux 上的 pdflatex、frozen texlive distro 2012
自描述 gnuplot 代码:
\documentclass[preview=true,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% http://www.ctan.org/pkg/gnuplottex
% amsmath for math labels
% code compiled with pdflatex engine via frozen texlive 2012 on Linux
\usepackage{gnuplottex,amsmath} % need shell-escape enabled and gnuplot 4.4
\begin{document}
\begin{gnuplot}[terminal=epslatex,terminaloptions=color]
# means comments in gnuplot syntax
unset border # border off
unset grid # grid off
unset key # dataset legends off
set format x '' # xtics without labels
set format y '' # ytics without labels
set size square # figure into square size
# xy co-ordinates range
xmin=-3;xmax=3;ymin=-15;ymax=15;
set samples 100 # no of divisions xaxis xmin to xmax
set zeroaxis # x axis and y-axis aligned to origin
set xrange [xmin:xmax] # plot range x and y
set yrange [ymin:ymax]
set arrow from xmin,0 to xmax,0 filled # xaxis starting (x,y) to ending
set arrow from 0,ymin to 0,ymax filled # yaxis starting to ending
# dotted line at discontinuity
set arrow from -1,ymin to -1,ymax nohead linestyle 2 linewidth 3 linecolor rgb 'black'
set xtics axis # x major ticks
set ytics axis # y major ticks
set title 'Asymptote $y=f(x+1)=\dfrac{1}{x+1}$ function in gnuplot'
#set xlabel "$x$"
#set ylabel "$f(x+1)$" rotate by 0 offset 20
# Piecewise func with ternary operator
a(x) = x<-1 ? 1.0/(x+1) : 1/0 # continous in x < -1
#b(x) = x=-1 ? inf : 1/0 # will not plot at discontinous x= -1
c(x) = x>-1 ? 1.0/(x+1) : 1/0 # continous in x > -1
plot a(x) linetype 1 linewidth 3 linecolor rgb 'gray',c(x) linetype 1 linewidth 3 linecolor rgb 'gray'
\end{gnuplot}
\end{document}
输出:
答案4
使用 PSTricks (运行xelatex
)
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\begin{document}
\begin{pspicture}(-4.25,-4.25)(4.25,4.25)
\psaxes[labels=none,ticksize=0 4pt]{->}(0,0)(-4,-4)(4,4)[$x$,-90][$y$,0]
\psplot[algebraic,linewidth=1.5pt,linecolor=blue,yMaxValue=4,plotpoints=1000]{-4}{4}{1/(x+1)}
\psline[linestyle=dashed](-1,-4)(-1,4)
\rput(2,3){$\displaystyle f(x)=\frac1{x+1}$}
\end{pspicture}
\end{document}
如果有人想确切地然后可以剪裁函数的最小/最大值:
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\begin{document}
\begin{pspicture}(-4.25,-4.25)(4.25,4.25)
\psaxes[labels=none,ticksize=0 4pt]{->}(0,0)(-4,-4)(4,4)[$x$,-90][$y$,0]
\psclip{\psframe[linestyle=none](-4,-4)(4,4)}
\psplot[algebraic,linewidth=1.5pt,linecolor=blue,yMaxValue=4.5,plotpoints=1000]{-4}{4}{1/(x+1)}
\endpsclip
\psline[linestyle=dashed](-1,-4)(-1,4)
\rput(2,3){$\displaystyle f(x)=\frac1{x+1}$}
\end{pspicture}
\end{document}
然而,通常它是不需要的!