Figura en TikZ para una función con parámetros

Etiquetas: Tikz , Logística

(English: Tikz Figure for a Function With Parameters)

Prometí en otra entrada de blog que mostraría el código en TikZ que produce la siguiente figura:

Lo que me gusta mucho de TikZ y su paquete pfgplots es que la curva en la figura es de verdad una curva logística y no solo una curva de Bezier o un spline que intenta imitar la forma de una logística. Específicamente, la función cuya gráfica aparece en la figura está dada por $$ f(t) = \frac{1}{1+e^{-4(x-2.5)}}. $$ Si uno grafica esta función en TikZ con mínimos ajustes, el resultado es este:

El código que produce esta última figura es muy simple y bonito:

\documentclass[border=5pt, 12pt, tikz]{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture} 
\begin{axis}%   
   [ axis lines = middle
   , width=200pt
   , samples=75 
   , xlabel = {$t$} 
   , ymax=1.2       
   ] 
   \addplot%
      [ color=blue
      , domain=0:4.5
      , style=thick
      ] {1/(1+exp(-4*(x-2.5))}%
      node
      [ above left
      , pos=0.7
      ] {$ \displaystyle f(t)=\frac{1}{1+e^{-4(t-2.5)}}$};
\end{axis} 
\end{tikzpicture}
\end{document}

En realidad, el código que produce la figura se encuentra entre los comandos \begin{tikzpicture} y \end{tikzpicture}. El resto son los comandos requeridos para indicar a $\LaTeX$ que debe crear un documento que contiene la figura. Así, el código de la figura en realidad es solo el siguiente:

\begin{axis}%   
   [ axis lines = middle
   , width=200pt
   , samples=75 
   , xlabel = {$t$} 
   , ymax=1.2       
   ] 
   \addplot%
      [ color=blue
      , domain=0:4.5
      , style=thick
      ] { 1/(1+exp(-4*(x-2.5)) }%
      node
      [ above left
      , pos=0.7
      ] {$ \displaystyle f(t)=\frac{1}{1+e^{-2(t-2.5)}}$};
\end{axis} 

Y este último solo tiene un par de partes:

  • El \begin{axis}[...] le dice a TikZ que debe crear unos ejes con algunas propiedades que se encuentran dentro del [...].
  • El comando \addplot[...]{...}, le dice a TikZ que agregue la gráfica de la función que se encuentra dentro de {...} y que use las propiedades dentro del [...] (como color azul, línea gruesa, etc.).
  • La segunda parte en \addplot[...]{...}node[...]{...}; le dice a Tikz que agregue un texto con el comando node. El texto está dentro del {...} que le sigue al node y las propiedades una vez más se encuentran dentro de [...].

Para obtener la figura con las etiquetas, las líneas punteadas, y los parámetros en los ejes, uno simplemente debe hacer ajustes graduales que lo lleven allí.

Hacer que las marcas en los ejes ejes sean parámetros generales en lugar de números.

Estas son las propiedades del axis que logran esto.

\begin{axis}%   
[ axis lines = middle
, width=200pt
, samples=75 
, xlabel = {$t$} 
, ymax=1.2
, xtick={2.5}
, xticklabel={$a$}
, ytick ={1/2,1}
, yticklabels={$L/2$,$L$}
, every axis x label/.style={at={(current axis.right of origin)},anchor=north west}        
] 

Aquí:

  • Las opciones xtick={2.5}, xticklabel={$a$} quitan las marcas de $1,2,3,4$ en el eje horizontal y las reemplazan con una sola marca en $x = 2.5$ con etiqueta $a$.
  • Las opciones ytick ={1/2,1}, yticklabels={$L/2$,$L$} hacen lo mismo, pero con las etiquetas del eje vertical.
  • La every axis x label/.style ... cambia la ubicacion de la etiqueta $t$ para el eje horizontal (una cuestión de gusto).

Esta es la figura que se obtiene:

Agregar las líneas punteadas y la flecha al punto de inflexión

Línea horizontal superior, con su etiqueta: se obtiene gratificando la función $f(x)=1$.

\addplot%
   [ style=dashed
   , color=black
   , domain=0:5
   ] {1} 
   node
   [ above
   , pos=0.6
   ] {top horizontal asymptote};

Línea horizontal del medio: se obtiene gratificando la función $f(x)=1/2$.

\addplot
   [ style=dashed
   , color=black
   , domain=0:2.5
   ] {1/2};

Línea horizontal inferior, con su etiqueta: se obtiene gratificando la función $f(x)=0$.

\addplot
   [ color=black
   , domain=0:4
   ] {0} 
   node
   [above
   , pos = 0.2
   , text width = 2cm
   , align=center
   ] {bottom horizontal asymptote};

Línea vertical en $x = 2.5$: esta no se puede obtener como la gráfica de una función, por lo que hay que usar una nueva estrategia (el comando draw).

\draw
   [ style = dashed
   ] (axis cs: 2.5,1/2) -- (axis cs: 2.5,0);

Aquí:

  • El \draw dice que vamos a dibujar.
  • El [style = dashed] es el estilo de línea.
  • El (...) -- (...) dibuja un segmento de recta entre los dos puntos.
  • El (axis cs: permite que uno use el sistema de coordenadas de los ejes en lugar del sistema de coordenadas absolutas de la figura (relacionado con el ancho de la figura, por ejemplo). El cs viene de cooordinate system.

La etiqueta “Punto de inflexión” apuntando con una flecha al punto (axis cs:2.5,0.5):

\draw
   [ ->
   , > = latex
   ] (axis cs:1.5,0.7) 
      node 
      [ left
      , text width = 1cm
      , align=center
      ] {inflection point}
      -- (axis cs:2.5,0.5);

Código completo

¡Y eso es todo!

Este es el código completo, con menos indentación y menos saltos de línea.

\documentclass[border=5pt, 12pt, tikz]{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture} 
\begin{axis}%   
[ axis lines = middle
, width=200pt
, samples=75 
, xlabel = {$t$} 
, ymax=1.2
, xtick={2.5}
, xticklabel={$a$}
, ytick ={1/2,1}
, yticklabels={$L/2$,$L$}
, every axis x label/.style={at={(current axis.right of origin)},anchor=north west}        
]

\addplot[color=blue, domain=0:4.5,style=thick]{1/(1+exp(-4*(x-2.5))} 
   node[right,pos=0.6]{$ \displaystyle\frac{L}{1+e^{-k(t-a)}}$};

\addplot[style=dashed, color=black, domain=0:5]{1} 
   node[above,pos=0.6]{top horizontal asymptote};

\addplot[style=dashed, color=black, domain=0:2.5]{1/2};

\addplot[color=black, domain=0:4]{0} 
   node[above,pos=0.2,text width=2cm, align=center]{bottom horizontal asymptote};

\draw[style=dashed] (axis cs: 2.5,1/2) -- (axis cs: 2.5,0);

\draw[->,>=latex]
   (axis cs:1.5,0.7) 
      node [left, text width=1cm, align=center]{inflection point}
   --(axis cs:2.5,0.5);
\end{axis} 
\end{tikzpicture}
\end{document}

Suscríbase

¿Quiere recibir un email cuando haya una nueva entrada de blog? Suscríbase acá.