Pfeile auf dem Graphen einer Funktion mit Tikz

Pfeile auf dem Graphen einer Funktion mit Tikz

Ich würde mich freuen, wenn Sie mir bei einem Problem in Tikz helfen könnten. Ich möchte für eine Arbeit über epidemiologische Systeme ein Diagramm zeichnen (wie unten dargestellt) und habe zwei Probleme (das wichtigere betrifft die Pfeile).

  1. Ich möchte drei Pfeile in das Diagramm zeichnen, die nach links zeigen, um die Bewegung anzuzeigen (die im Grunde bei S = 1 beginnt). Ich habe versucht, dies basierend auf dieser Antwort umzusetzen (Fügen Sie einer glatten Tikz-Funktion Pfeile hinzu), aber ich bekomme keine 3 Pfeile und habe keine Ahnung, wie ich die Richtung ändern kann.

  2. Ich brauche viele Samples (2000), um den Graphen vollständig zu zeichnen. Wenn ich weniger Samples verwende, hört der Graph einfach auf. Haben Sie eine Idee, wie man das verbessern kann?

Danke für deine Unterstützung.

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

Bildbeschreibung hier eingeben

Antwort1

Willkommen! Wie bei 2 habe ich eine Domäne hinzugefügt, um ungültige Punkte zu vermeiden, in denen Logarithmen von negativen Zahlen oder Nullen genommen werden, und wie bei 1 die Pfeilpositionen festgelegt. Leider decorations.markingstreten bei glatten Diagrammen leicht Fehler auf dimension too large, sodass man entfernen muss smooth, aber angesichts der immer noch mäßig großen Anzahl von Beispielen sieht das Ergebnis immer noch gut aus und ist kaum von der glatten Version zu unterscheiden.

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

Bildbeschreibung hier eingeben

Man kann die dimension too largeFehler vermeiden und glatte Diagramme verwenden, wenn man Ti sagtkZ fpuzur Berechnung der Kehrwerte.

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

Bildbeschreibung hier eingeben

verwandte Informationen