我怎样才能生成这样的分段函数图?

我怎样才能生成这样的分段函数图?

我正在撰写行为经济学论文,必须绘制单独的折扣函数,我用 stata 绘制了下面的图表,但希望用 tikz 绘制。

线性图表的屏幕截图

我在 tikz 中玩了一下,目前得到了以下结果:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[domain=-1:5,samples=400]
        \addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
        \addplot+[mark=none] {0.7*0.8^(x+1)};
    \end{axis}
\end{tikzpicture}
\end{document}

输出结果如下:

包含两条线的线性图的屏幕截图

遗憾的是我的截止日期快到了。有人能帮我解决以下问题吗?

  1. y 轴的范围应为 0 到 1。

  2. x 轴的范围应为 0 至 5,并且显示的 x 值应为函数的真实值 +1。

  3. 功能不应该交叉,只需接触即可

     \addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
    

从 x=-1 到 0(显示值:0 到 1)

     \addplot+[mark=none] {0.7*0.8^(x+1)};

从 x=0 到 4(显示值:1 到 5)

  1. 两个功能应该具有相同的颜色(黑色)。

答案1

您只需将域规范添加到每个函数即可限制函数的显示部分。要在 x 轴上显示不同的值,只需从+1函数中删除 ,将其向右移动一位即可。可以将颜色规范添加到 ,\addplot以将其全部设置为黑色,最后,如果您想确保不显示 y 域 0:1 之外的任何数据,请使用restrict y to domain=0:1

编辑:以 pgfplots 方式添加轴标签。
编辑2:添加了第二个图和图例。请注意,\addlegendentry只是按照的顺序添加条目\addplots,并将两部分视为单独的图,因此最简单的方法是先绘制每个图的所有第一部分,设置图例,然后绘制每个图的第二部分。

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        domain=0:5,
        samples=400,
%        ymin=-0.1,   % Uncomment if 0 should really be shown,
%        ymax=1.1,    % leave commented to let pgfplots figure out the exact y domain
        restrict y to domain=0:1,
        xlabel={Month},
        ylabel={Value of Discount Function},
        ]
        \addplot+[mark=none,black,domain=0:1] {1-(1-0.7*0.8)*(x)};
        \addplot+[mark=none,blue,domain=0:1] {0.8-(1-0.7*0.8)*(x)};
        \addlegendentry{A}
        \addlegendentry{B}
        \addplot+[mark=none,black,domain=1:5] {0.7*0.8^(x)};
        \addplot+[mark=none,blue,domain=1:5] {0.7*0.8^(x)-0.2};
    \end{axis}
\end{tikzpicture}
\end{document}

更新的情节

答案2

代码如下:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}

\usepackage{rotating}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[samples=400,
        ymin = -0.1,
        ymax = 1.1,
        xmin = -0.3,
        xmax = 5.3]
        \addplot+[mark=none, domain=0:1, black] {1-(1-0.7*0.8)*x};
        \addplot+[mark=none, domain=1:5, black] {0.7*0.8^x};
    \end{axis}

    \draw (3.5, -0.7) node [below] {Month};

    \draw (-0.9, 2.7) node [left] {\rotatebox{90}{Value of Discount Function}};

\end{tikzpicture}
\end{document}

输出:

在此处输入图片描述

我做了什么:

  1. 将键ymin和添加ymaxaxis环境中:这些设置的限制-轴。我添加了少量填充以匹配 Stata 图表,但如果您愿意,您可以轻松地将它们设置为精确的 0 和 1。

  2. 添加键xminxmax设置限制X-轴。额外的水平填充主要通过目测和调整来确定。

    为了使函数翻译为 +1,我只需在两个定义中替换即可x+1xaddplot我不完全确定你的意思,但根据 Stata 图表判断。)

  3. 您不必将域设置为 的选项axis,而是可以将其作为 的单独参数提供addplot。因此,我在两个绘图函数中添加了domain=0:1domain=1:5,这样您就只能得到一条线。(请注意 +1 的平移以适应轴移位。)

  4. 将参数添加black到两个addplot命令中。

我还添加了两个\draw命令来放置和旋转轴标签。(同样,大部分都是通过眼睛完成的,尽管我认为有更好的方法。)

答案3

解决方案来自胡戈夫德山以及来自alexwlchan缺点是它们都分段绘制分段函数,一般来说一些缺点,例如

  • 当你需要在图中绘制多个函数时出现图例问题,或者
  • 人们必须追踪风格。

(这些是从JM114516


如果您知道分段函数的两个函数部分,但不知道交点在哪里,您可以简单地使用该max函数(在这种情况下)在一个命令中绘制该函数\addplot...

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{
        % use at least this compat level
        % to improve positioning of the axis labels
        compat=1.3,
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            % set ymin value
            ymin=0,
            % in which domain should the expression be calculated ...
            domain=0:5,
            % ... with how many samples?
            samples=400,
            % add axis labels
            xlabel={Month},
            ylabel={Value of Discount Function},
            % don't show markers
            no markers,
        ]
        % piecewise function part 1
            \addplot [black!25,very thick] expression {
                    1-(1-0.7*0.8)*x
            };
        % piecewise function part 2
            \addplot [black!25,very thick,dashed] expression {
                    0.7*0.8^x
            };
        % piecewise function combined
            \addplot [red] expression {
                max(
                    1-(1-0.7*0.8)*x,
                    0.7*0.8^x
                )
            };

            \legend{
                ,           % <-- empty string to ignore this `\addplot'
                ,
                discount function,
            }
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容