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.
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:
Lamentablemente mi fecha límite es muy pronto. ¿Alguien podría ayudarme con las siguientes correcciones?
el rango del eje y debe ser de 0 a 1.
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.
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)
- 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 +1
tu función. Se puede agregar una especificación de color para \addplot
configurarlo 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 \addlegendentry
simplemente agrega entradas en el orden de \addplots
y 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}
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:
Qué he hecho:
Se suman las claves
ymin
yymax
alaxis
entorno: é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.Se agregaron las claves
xmin
yxmax
para 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+1
porx
en las dosaddplot
definiciones. (No estaba del todo seguro de lo que quería decir con esto, pero lo juzgué por el gráfico de Stata).En lugar de configurar el dominio como una opción para
axis
, puede proporcionarlo como un argumento separado paraaddplot
. Entonces agreguédomain=0:1
ydomain=1:5
a 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).Agregue el argumento
black
a ambosaddplot
comandos.
También agregué dos \draw
comandos 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 max
función (en este caso) para dibujar la función en un solo \addplot
comando...
\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}