Como posso produzir esse gráfico da minha função por partes?

Como posso produzir esse gráfico da minha função por partes?

Estou escrevendo minha tese em economia comportamental e preciso desenhar funções de desconto individuais, fiz o gráfico a seguir com stata, mas adoraria tê-lo com tikz.

Captura de tela de um gráfico linear

Eu brinquei no tikz e consegui isso até agora:

\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}

o que leva a esta saída:

Captura de tela de um gráfico linear com duas linhas

Infelizmente meu prazo é muito próximo. Alguém poderia me ajudar com as seguintes correções?

  1. o intervalo do eixo y deve ser de 0 a 1.

  2. o intervalo do eixo x deve ser de 0 a 5, E o valor x mostrado deve ser o valor verdadeiro da função +1.

  3. as funções não devem se cruzar, basta tocar, ou seja

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

de x=-1 a 0 (valores mostrados: 0 a 1)

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

de x = 0 a 4 (valores mostrados: 1 a 5)

  1. Ambas as funções deverão ter a mesma cor (preto).

Responder1

Você pode simplesmente adicionar a especificação do domínio a cada função para restringir a parte mostrada da função. Para exibir valores diferentes no eixo x, basta deslocá-lo um para a direita, removendo o +1da sua função. A especificação de cor pode ser adicionada para \addplotdefinir tudo como preto e, finalmente, se você quiser ter certeza de que nenhum dado fora do domínio y 0:1 será exibido, use restrict y to domain=0:1.

Editar:o eixo adicionado rotula a maneira pgfplots.
Editar 2:Adicionado segundo enredo e legenda. Observe que \addlegendentrysimplesmente adiciona entradas na ordem do \addplotse vê as duas partes como gráficos separados, então a maneira mais fácil é primeiro plotar todas as primeiras partes de cada gráfico, configurar a legenda e, em seguida, plotar a segunda parte de cada gráfico .

\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}

Parcelas atualizadas

Responder2

Aqui está o código:

\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}

e a saída:

insira a descrição da imagem aqui

O que eu fiz:

  1. Adicionadas as chaves ymine ymaxao axisambiente: estas definem os limites dosim-eixo. Adicionei uma pequena quantidade de preenchimento para corresponder ao gráfico Stata, mas você pode facilmente defini-los exatamente como 0 e 1, se preferir.

  2. Adicionadas as chaves xmine xmaxpara definir os limites dox-eixo. O preenchimento horizontal extra foi determinado principalmente a olho nu e por ajustes.

    Para traduzir a função por +1, simplesmente substituí x+1por xnas duas addplotdefinições. (Eu não tinha certeza do que você quis dizer com isso, mas julguei pelo gráfico do Stata.)

  3. Em vez de definir o domínio como uma opção para axis, você pode fornecê-lo como um argumento separado para addplot. Então adicionei domain=0:1e domain=1:5às duas funções de plotagem, para que você obtenha apenas uma linha. (Observe a translação em +1 para acomodar a mudança do eixo.)

  4. Adicione o argumento blacka ambos addplotos comandos.

Também adicionei dois \drawcomandos para posicionar e girar os rótulos dos eixos. (Novamente, principalmente feito a olho nu, embora eu ache que há uma maneira melhor de fazer isso.)

Responder3

A solução dehugovdbergbem como dealexwlchantêm a desvantagem de que ambos desenham a função por partes, que temem geralalgumas desvantagens como

  • problemas de legenda quando você precisa desenhar mais de uma função em um gráfico ou
  • é preciso acompanhar os estilos.

(Peguei emprestado deJM114516.)


Se você conhece as duas partes da função por partes, mas não sabe onde está o ponto de intersecção, você pode simplesmente usar a maxfunção (neste caso) para desenhar a função em um \addplotcomando...

\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}

imagem mostrando o resultado do código acima

informação relacionada