Как мне построить такой график моей кусочной функции?

Как мне построить такой график моей кусочной функции?

Я пишу диссертацию по поведенческой экономике и мне нужно построить индивидуальные дисконтные функции. Я сделал следующий график с помощью 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и ymaxк axisсреде: они устанавливают ограниченияу-axis. Я добавил небольшое количество отступов, чтобы соответствовать графику Stata, но вы можете легко установить их точно на 0 и 1, если хотите.

  2. Добавлены ключи xminи xmaxдля установки лимитовИкс-axis. Дополнительный горизонтальный отступ определялся в основном на глаз и путем подгонки.

    Чтобы перевести функцию на +1, я просто заменил x+1на xв двух addplotопределениях. (Я не совсем понял, что вы имели в виду, но судил об этом по графику Stata.)

  3. Вместо того, чтобы задавать домен как опцию для axis, вы можете предоставить его как отдельный аргумент для addplot. Поэтому я добавил domain=0:1и domain=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}

изображение, показывающее результат кода выше

Связанный контент