¿Cómo puedo producir una gráfica de este tipo de mi función por partes?

¿Cómo puedo producir una gráfica de este tipo de mi función por partes?

Estoy escribiendo mi tesis en economía del comportamiento y tengo que dibujar funciones de descuento individuales, hice el siguiente gráfico con stata, pero me encantaría tenerlo con tikz.

Captura de pantalla de un gráfico lineal

Jugué en tikz y obtuve esto hasta ahora:

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

lo que conduce a esta salida:

Captura de pantalla de un gráfico lineal con dos líneas.

Lamentablemente mi fecha límite es muy pronto. ¿Alguien podría ayudarme con las siguientes correcciones?

  1. el rango del eje y debe ser de 0 a 1.

  2. el rango del eje x debe ser de 0 a 5, Y el valor x mostrado debe ser el valor verdadero de la función +1.

  3. las funciones no deberían cruzarse, solo tocar, es decir

     \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 funciones deben tener el mismo color (negro).

Respuesta1

Simplemente puede agregar la especificación de dominio a cada función para restringir la parte mostrada de la función. Para mostrar diferentes valores en el eje x, simplemente muévalo uno hacia la derecha eliminando de +1tu función. Se puede agregar una especificación de color para \addplotconfigurarlo todo en negro y, finalmente, si desea asegurarse de que no se muestren datos fuera del dominio y 0:1, utilice restrict y to domain=0:1.

Editar:Se agregaron etiquetas de eje en forma de pgfplots.
Edición 2:Se agregó una segunda trama y leyenda. Tenga en cuenta que \addlegendentrysimplemente agrega entradas en el orden de \addplotsy ve las dos partes como gráficos separados, por lo que la forma más fácil es trazar primero todas las primeras partes de cada gráfico, configurar la leyenda y luego trazar la 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 actualizadas

Respuesta2

Aquí está el 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}

y la salida:

ingrese la descripción de la imagen aquí

Qué he hecho:

  1. Se suman las claves yminy ymaxal axisentorno: éstas marcan los límites dely-eje. Agregué una pequeña cantidad de relleno para que coincida con el gráfico de Stata, pero puedes configurarlos fácilmente exactamente en 0 y 1 si lo prefieres.

  2. Se agregaron las claves xminy xmaxpara establecer los límites delX-eje. El acolchado horizontal adicional se determinó principalmente a ojo y mediante ajustes.

    Para traducir la función a +1, simplemente la reemplacé x+1por xen las dos addplotdefiniciones. (No estaba del todo seguro de lo que quería decir con esto, pero lo juzgué por el gráfico de Stata).

  3. En lugar de configurar el dominio como una opción para axis, puede proporcionarlo como un argumento separado para addplot. Entonces agregué domain=0:1y domain=1:5a las dos funciones de trazado, por lo que solo obtienes una línea. (Tenga en cuenta la traducción en +1 para adaptarse al desplazamiento del eje).

  4. Agregue el argumento blacka ambos addplotcomandos.

También agregué dos \drawcomandos para colocar y rotar las etiquetas de los ejes. (Nuevamente, se hace principalmente a ojo, aunque creo que hay una manera mejor de hacerlo).

Respuesta3

La solución dehugovdbergasí como dealexwlchantienen la desventaja de que ambos dibujan la función por partes que tieneen generalalgunas desventajas como

  • Problemas de leyenda cuando es necesario dibujar más de una función en un gráfico o
  • hay que estar al tanto de los estilos.

(Tomé prestados estos deJM114516.)


Si conoce las dos partes de la función por partes pero no sabe dónde está el punto de intersección, puede simplemente usar la maxfunción (en este caso) para dibujar la función en un solo \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}

imagen que muestra el resultado del código anterior

información relacionada