区分関数のこのようなグラフを作成するにはどうすればよいでしょうか?

区分関数のこのようなグラフを作成するにはどうすればよいでしょうか?

私は行動経済学の論文を書いており、個別の割引関数を描く必要があります。次のグラフは 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}

出力は次のようになります:

2本の線で描かれた線形グラフのスクリーンショット

残念ながら締め切りが近づいています。以下の修正についてどなたか手伝っていただけますか?

  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関数から を削除して、 を 1 つ右にシフトするだけです。 に色指定を追加して\addplotすべてを黒に設定することもできます。最後に、 y ドメイン 0:1 の外側のデータが表示されないようにするには、 を使用しますrestrict y to domain=0:1

編集:pgfplots の方法で軸ラベルを追加しました。
編集2:2 番目のプロットと凡例を追加しました。 は、\addlegendentryの順序でエントリを追加する\addplotsだけで、2 つの部分を別々のプロットとして扱うので、最も簡単な方法は、まず各プロットの最初の部分をすべてプロットし、凡例を設定してから、各プロットの 2 番目の部分をプロットすることです。

\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制限を設定するバツ-軸。追加の水平方向のパディングは、主に目視と微調整によって決定されました。

    関数を +1 で変換するには、2 つの定義でx+1を単に置き換えました。(これによって何を意味しているのかよくわかりませんでしたが、Stata グラフから判断しました。)xaddplot

  3. ドメインを のオプションとして設定するのではなくaxis、 の別の引数として指定することができます。そこで、と を2 つのプロット関数にaddplot追加したので、1 本の線だけが表示されます。(軸のシフトに対応するために +1 だけ変換されていることに注意してください。)domain=0:1domain=1:5

  4. black両方のコマンドに引数を追加しますaddplot

また、\draw軸ラベルを配置および回転するための 2 つのコマンドも追加しました。(これもほとんど目視で行いますが、もっと良い方法があると思います。)

答え3

解決策はヒューゴブベリからだけでなくアレックスwlchanどちらも区分関数を区分的に描画するという欠点があり、一般的にいくつかの欠点としては

  • プロットに複数の関数を描画する必要がある場合や、
  • スタイルを追跡する必要があります。

(以下より拝借)JM114516


区分関数の 2 つの関数部分はわかっていても、交点がどこにあるかがわからない場合は、関数max(この場合は) を使用して、1 つのコマンドで関数を描画することができます\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}

上記コードの結果を示す画像

関連情報