我有一个函数定义为:
我如何使用函数而不是坐标来绘制图形?我目前正在使用 pgfplots,但如果有更好的选择,我愿意尝试其他方法。
答案1
您的职能
有 3 个不连续点,分别为t=0
、t=1
和t=2
。下图从数学角度来看是正确的。
\documentclass[border=0bp]{standalone}
\usepackage{pst-plot}
\begin{document}
\psset{unit=1.5cm}
\begin{pspicture}[showgrid=false](-2.75,-0.75)(4,2)
\psframe*[linecolor=yellow,opacity=0.5](-2.75,-0.75)(4,2)
\psaxes[linecolor=lightgray]{->}(0,0)(-2.5,-0.5)(3.5,1.5)[$t$,0][$F(t)$,90]
\psset{algebraic,linewidth=1.5pt,linecolor=red}
\psplot[arrows=-o]{-2.5}{-1}{0}
\psset{arrows=*-o}
\psplot{-1}{0}{(x+1)/4}
\psplot{0}{1}{1/2}
\psplot{1}{2}{(x+7)/12}
\psplot[arrows=*-]{2}{3.5}{1}
\end{pspicture}
\end{document}
编辑3
尽管必须避免使用垂直线连接不连续点,但这样做很容易,因为图形将不再告诉我们有关函数的信息。
\documentclass[border=0bp]{standalone}
\usepackage{pst-plot}
\begin{document}
\psset{unit=1.5cm}
\begin{pspicture}[showgrid=false](-2.75,-0.75)(4,2)
\psframe*[linecolor=yellow,opacity=0.5](-2.75,-0.75)(4,2)
\psaxes[linecolor=lightgray]{->}(0,0)(-2.5,-0.5)(3.5,1.5)[$t$,0][$F(t)$,90]
\psset{algebraic,linewidth=1.5pt,linecolor=red}
\pscustom
{
\psplot{-2.5}{-1}{0}
\psplot{-1}{0}{(x+1)/4}
\psplot{0}{1}{1/2}
\psplot{1}{2}{(x+7)/12}
\psplot{2}{3.5}{1}
}
\end{pspicture}
\end{document}
编辑3.1
我忘了告诉你,你需要用xelatex
或 序列latex
后跟 来dvips
编译它(以获得紧密的 PDF 图像) ps2pdf
。
使用 从输入文件中导入 PDF 图像,\includegraphics
并使用 编译主输入文件pdflatex
。我猜你的场景是这样的。
编辑 3.14
我在前言中添加了一些宏,用于调整画布和边框的大小。希望对你有用。
\documentclass[border=0bp]{standalone}
\usepackage{pst-plot}
% to adjust the unit
\psset
{
xunit=1cm,
yunit=3cm,
}
% to adjust the axes
\def\L{-2.5}
\def\R{3.5}
\def\B{-0.2}
\def\T{1.2}
% to adjust the borders
\def\dL{2pt}
\def\dR{12pt}
\def\dB{2pt}
\def\dT{18pt}
\begin{document}
\begin{pspicture}[showgrid=false]
(\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
(\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)
%comment the following \psframe* if you DON'T need a colored background.
\psframe*[linecolor=blue,opacity=0.1]
(\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
(\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)
\psaxes[linecolor=lightgray]{->}(0,0)(\L,\B)(\R,\T)[$t$,0][$F(t)$,90]
\psset{algebraic,linewidth=1.5pt,linecolor=red}
\psplot[arrows=-o]{\L}{-1}{0}
\psset{arrows=*-o}
\psplot{-1}{0}{(x+1)/4}
\psplot{0}{1}{1/2}
\psplot{1}{2}{(x+7)/12}
\psplot[arrows=*-]{2}{\R}{1}
\end{pspicture}
\end{document}
编辑 3.141
我刚刚意识到,使用默认值plotpoints
(即20
)时,每个空心点都有一个不好的特性。幸运的是,您的函数频率较低,因此我可以减少plotpoints
到而2
不会产生副作用,以隐藏不好的特性。
\documentclass[border=0bp]{standalone}
\usepackage{pst-plot}
% to adjust the unit
\psset
{
xunit=1cm,
yunit=3cm,
}
% to adjust the axes
\def\L{-2.5}
\def\R{3.5}
\def\B{-0.2}
\def\T{1.2}
% to adjust the borders
\def\dL{2pt}
\def\dR{12pt}
\def\dB{2pt}
\def\dT{18pt}
\begin{document}
\begin{pspicture}[showgrid=false]
(\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
(\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)
%comment the following \psframe* if you DON'T need a colored background.
%\psframe*[linecolor=blue,opacity=0.1]
%(\dimexpr\L\psxunit-\dL\relax,\dimexpr\B\psyunit-\dB\relax)
%(\dimexpr\R\psxunit+\dR\relax,\dimexpr\T\psyunit+\dT\relax)
\psaxes[linecolor=lightgray]{->}(0,0)(\L,\B)(\R,\T)[$t$,0][$F(t)$,90]
\psset{algebraic,linewidth=1.5pt,linecolor=red,plotpoints=2}
\psplot[arrows=-o]{\L}{-1}{0}
\psset{arrows=*-o}
\psplot{-1}{0}{(x+1)/4}
\psplot{0}{1}{1/2}
\psplot{1}{2}{(x+7)/12}
\psplot[arrows=*-]{2}{\R}{1}
\end{pspicture}
\end{document}
如果你的函数频率很高,那么降低频率plotpoints
会使图变得不再平滑。为了避免这种副作用,我们必须增加plotpoints
并用实心圆覆盖空心点。
答案2
如果您正在使用,pgfplots
您可以使用pgfmathdeclarefunction
来指定函数,然后像使用内置函数一样使用它。如果您希望连接端点,则可以一次绘制所有内容,或者分别绘制每个部分:
参考:
代码:
\documentclass[border=3pt]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\newcommand*{\PhM}{\phantom{-}}%
\newcommand{\pLabel}{%
$F(t) = \begin{cases}
0 & \PhM t < -1 \\[0.8ex]
\frac{1}{4}t+\frac{1}{4} & -1\le t <0 \\[0.8ex]
\frac{1}{2} & \PhM 0\le t <1\\[0.8ex]
\frac{1}{12}t+\frac{7}{12} & \PhM 1\le t <2\\[0.8ex]
1 & \PhM t\ge 2
\end{cases}
$
}
\pgfmathdeclarefunction{PieceA}{1}{(0)}%
\pgfmathdeclarefunction{PieceB}{1}{(#1/4 + 1/4)}%
\pgfmathdeclarefunction{PieceC}{1}{(0.5)}%
\pgfmathdeclarefunction{PieceD}{1}{(#1/12 + 7/12)}%
\pgfmathdeclarefunction{PieceE}{1}{(1)}%
\pgfmathdeclarefunction{MyFunction}{1}{%
\pgfmathparse{%
(and( 1, #1<-1)*(0) +%
(and(#1>=-1, #1< 0)*(#1/4 + 1/4) +%
(and(#1>= 0, #1< 1)*(0.5) +%
(and(#1>= 1, #1< 2)*(#1/12 + 7/12) +%
(and(#1>= 2, 1 )*(1)%
}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[domain=-5:5, blue, samples=100, ultra thick] {MyFunction(x)};
\node [right] at (axis cs: -5.5,0.7) {\tiny\pLabel};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}
\foreach \xStart/\xEnd in {-5/-1, -1/0, 0/1, 1/2, 2/5} {
\addplot[domain=\xStart:\xEnd, blue, samples=10, ultra thick] {MyFunction(x)};
}
\node [right] at (axis cs: -5.5,0.7) {\tiny\pLabel};% Labe graph
% Show discontinuty points
\draw [draw=blue, fill=white, thick] (axis cs: 0, 0.250) circle (2.0pt);
\draw [draw=blue, fill=blue, thick] (axis cs: 0, 0.500) circle (2.0pt);
\draw [draw=blue, fill=white, thick] (axis cs: 1, 0.500) circle (2.0pt);
\draw [draw=blue, fill=blue, thick] (axis cs: 1, 0.666) circle (2.0pt);
\draw [draw=blue, fill=white, thick] (axis cs: 2, 0.750) circle (2.0pt);
\draw [draw=blue, fill=blue, thick] (axis cs: 2, 1.000) circle (2.0pt);
\end{axis}
\end{tikzpicture}
\end{document}