Flechas en la gráfica de una función con Tikz

Flechas en la gráfica de una función con Tikz

Me encantaría que me pudieran ayudar con un problema en Tikz. Quiero dibujar un diagrama para un artículo sobre sistemas epidemiológicos (como se ilustra a continuación) y tengo dos cuestiones (la más importante es la relativa a las flechas).

  1. Quiero dibujar 3 flechas en el gráfico que apunten hacia la izquierda para mostrar el movimiento (que básicamente comienza en S = 1). Intenté implementar esto en base a esta respuesta (Agregar flechas a una función tikz suave), pero no puedo obtener 3 flechas y no tengo idea de cómo cambiar la dirección.

  2. Necesito muchas muestras (2000) para dibujar el gráfico completo. Si uso menos muestras, el gráfico simplemente se detiene. ¿Tienes una idea de cómo mejorar esto?

Gracias por su apoyo.

\documentclass[tikz,border=2mm]{standalone}
    \usepackage{pgfplots}
    \usetikzlibrary{arrows.meta,positioning}
    \usetikzlibrary{decorations.markings}
    \tikzset{
        set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
        set arrow inside={end/.initial=>, opt/.initial=},
        /pgf/decoration/Mark/.style={
            mark/.expanded=at position #1 with
            {
                \noexpand\arrow[\pgfkeysvalueof{/tikz/arrow inside/opt}]{\pgfkeysvalueof{/tikz/arrow inside/end}}
            }
        },
        arrow inside/.style 2 args={
            set arrow inside={#1},
            post*emphasized text*action={
                decorate,decoration={
                    markings,Mark/.list={#2}
                }
            }
        },
    }

\begin{document}
\begin{tikzpicture}[>=latex]
        \begin{axis}[
            axis x line=center,
            axis y line=center,
            xmin=0, xmax=1.1, 
            ymin=0, ymax=1.1,
            xtick={0,1},
            ytick={0,1},
            hide obscured x ticks=false,
            extra x ticks={0.33},
            extra x tick labels={$\frac{\gamma}{\beta}$},
            extra y ticks={0.3},
            extra y tick labels={$I_{\text{max}}$},
            xlabel=$S$, ylabel=$I$,
            xlabel style={right},
            ylabel style={above},
            scale=1.2
            ]

            \draw[dashed] (axis cs: 0.33,1) -- (axis cs: 0.33,0) node[pos=1, below] {$\frac{\gamma}{\beta}$};
            \draw[dashed] (axis cs: 0,0.3) -- (axis cs: 1,0.3);

            \addplot[smooth] {1-x};
            \addplot[samples=2000, red, smooth] {1 + (1/3) * ln(x) - x} [arrow inside={end=stealth,opt={red,scale=2}}{0.25,0.50.75}];
            %\addplot[samples=1500, green, smooth] {1 + (1/6) * ln(x) - x} [arrow inside={end=stealth,opt={green,scale=1.5}}{0.25,0.50.75}];
            \node[label={45:{$(S^*,I_{\text{max}})$}}, circle, fill, inner sep=1pt] at (axis cs: 0.33,0.3) {};
        \end{axis}
    \end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta1

¡Bienvenido! En cuanto a 2, agregué un dominio para evitar puntos no válidos en los que se toman logaritmos de números negativos o cero y, en cuanto a 1, arreglé las posiciones de las flechas. Desafortunadamente, los gráficos suaves decorations.markingsdan lugar fácilmente a dimension too largeerrores, por lo que hay que eliminarlos smooth, pero teniendo en cuenta el número todavía moderadamente grande de muestras, el resultado sigue pareciendo bueno y apenas se distingue de la versión suave.

\documentclass[tikz,border=2mm]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usetikzlibrary{arrows.meta,positioning}
\usetikzlibrary{decorations.markings}
\tikzset{
    set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
    set arrow inside={end/.initial=>, opt/.initial=},
    /pgf/decoration/Mark/.style={
        mark/.expanded=at position #1 with
        {
            \noexpand\arrow[\pgfkeysvalueof{/tikz/arrow inside/opt}]{\pgfkeysvalueof{/tikz/arrow inside/end}}
        }
    },
    arrow inside/.style 2 args={
        set arrow inside={#1},
        postaction={
            decorate,decoration={
                markings,Mark/.list={#2}
            }
        }
    },
}

\begin{document}
\begin{tikzpicture}[>=latex]
        \begin{axis}[
            axis x line=center,
            axis y line=center,
            xmin=0, xmax=1.1, 
            ymin=0, ymax=1.1,
            xtick={0,1},
            ytick={0,1},
            hide obscured x ticks=false,
            extra x ticks={0.33},
            extra x tick labels={$\frac{\gamma}{\beta}$},
            extra y ticks={0.3},
            extra y tick labels={$I_{\text{max}}$},
            xlabel=$S$, ylabel=$I$,
            xlabel style={right},
            ylabel style={above},
            scale=1.2
            ]

            \draw[dashed] (axis cs: 0.33,1) -- (axis cs: 0.33,0) node[pos=1, below] {$\frac{\gamma}{\beta}$};
            \draw[dashed] (axis cs: 0,0.3) -- (axis cs: 1,0.3);

            \addplot[smooth] {1-x};
            \addplot[samples=101, red,domain=0.05:1,
                arrow inside={end=stealth,opt={red,scale=2}}{0.25,0.5,0.75}] 
                {1 + (1/3) * ln(x) - x} 
            ;
            \addplot[samples=101, green!70!black, domain=0.002:1,
                arrow inside={end=stealth,opt={green!70!black,scale=1.5}}{0.25,0.5,0.75}] {1 + (1/6) * ln(x) - x} ;
            \node[label={45:{$(S^*,I_{\text{max}})$}}, circle, fill, inner sep=1pt]
             at (axis cs: 0.33,0.3) {};
        \end{axis}
    \end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Se pueden evitar los dimension too largeerrores y utilizar gráficos suaves si se le dice a TikZ para usar fpupara calcular recíprocos.

\documentclass[tikz,border=2mm]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usetikzlibrary{arrows.meta,positioning}
\usetikzlibrary{decorations.markings}
\tikzset{
    set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
    set arrow inside={end/.initial=>, opt/.initial=},
    /pgf/decoration/Mark/.style={
        mark/.expanded=at position #1 with
        {
            \noexpand\arrow[\pgfkeysvalueof{/tikz/arrow inside/opt}]{\pgfkeysvalueof{/tikz/arrow inside/end}}
        }
    },
    arrow inside/.style 2 args={
        set arrow inside={#1},
        postaction={
            decorate,decoration={
                markings,Mark/.list={#2}
            }
        }
    },
}

\makeatletter
\tikzset{use fpu reciprocal/.code={%
\def\pgfmathreciprocal@##1{%
    \begingroup
    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}%
    \pgfmathparse{1/##1}%
    \pgfmath@smuggleone\pgfmathresult
    \endgroup
}}}%
\makeatother


\begin{document}
\begin{tikzpicture}[>=latex]
        \begin{axis}[
            axis x line=center,
            axis y line=center,
            xmin=0, xmax=1.1, 
            ymin=0, ymax=1.1,
            xtick={0,1},
            ytick={0,1},
            hide obscured x ticks=false,
            extra x ticks={0.33},
            extra x tick labels={$\frac{\gamma}{\beta}$},
            extra y ticks={0.3},
            extra y tick labels={$I_{\text{max}}$},
            xlabel=$S$, ylabel=$I$,
            xlabel style={right},
            ylabel style={above},
            scale=1.2
            ]

            \draw[dashed] (axis cs: 0.33,1) -- (axis cs: 0.33,0) node[pos=1, below] {$\frac{\gamma}{\beta}$};
            \draw[dashed] (axis cs: 0,0.3) -- (axis cs: 1,0.3);

            \addplot[smooth] {1-x};
            \begin{scope}[use fpu reciprocal,>=stealth]
            \addplot[samples=101, red,domain=0.05:1,smooth,
                arrow inside={end={<},opt={red,scale=2}}{0.25,0.5,0.75}] 
                {1 + (1/3) * ln(x) - x} 
            ;
            \addplot[samples=101, green!70!black, domain=0.002:1,smooth,
                arrow inside={end={<},opt={green!70!black,scale=1.5}}{0.25,0.5,0.75}] {1 + (1/6) * ln(x) - x} ;
            \end{scope} 
            \node[label={45:{$(S^*,I_{\text{max}})$}}, circle, fill, inner sep=1pt]
             at (axis cs: 0.33,0.3) {};
        \end{axis}
    \end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada