Hallo.

Ich habe versucht, eine Wahrscheinlichkeitsfunktion und die dazugehörige Verteilungsfunktion in zwei verschiedenen Koordinatensystemen darzustellen.

Die Wahrscheinlichkeitsfunktion hat auch wunderbar funktioniert, jedoch gibt es Probleme bei der Verteilungsfunktion. Ich möchte eine Schleife erstellen, die in jedem Durchlauf einen Teil der Funktion zeichnet, genauer gesagt die Zuordnung x-->F(x).

Das Problem ist nun aber, dass der Wert F(x) auf den vorigen Werten immer aufbaut. D.h. ich brauche eine Möglichkeit, um diesen Wert zu speichern und für den nächsten Schleifendurchgang verwenden zu können. Ich habe bereits einiges versucht, aber es scheinen foreach- Schleifen nicht in der axis-Umgebung zu funktionieren. Ich habe jetzt auch viel zu diesen pgfplotsinvokeforeach- Schleifen gelesen, aber bisher konnte ich noch keine Lösung auf das Problem finden.

Ich habe hier etwas erstellt, was zwar allem Anschein nach den Wert speichert (wobei ich mir da auch nicht so sicher bin), jedoch verändert das gleichzeitig auch alle anderen Werte aus vorigen Schleifendurchgängen, was dafür sorgt, dass sich alle Werte verschieben und auf eine Höhe kommen, was nicht sein sollte.

Hier wäre mal so das Minimalbeispiel:

Öffne in Overleaf
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}

\begin{document}

\begin{figure}[h]
\begin{minipage}{0.5\textwidth}
\centering
    \begin{tikzpicture}
        \begin{axis}[
        axis lines=middle,
        xmin=0,
        xmax=5,
        height=6cm,
        width=8cm,
        ymin=0,
        ymax=0.4,
        xlabel=$x$,
        ylabel=$p_i$,
        xlabel style=right,
        ylabel style=above,
        enlargelimits=0.05,
        ]

        \draw[fill=red!20!white] \foreach   \i in {1,...,5  }{
        (axis cs:{\i-0.5},{0})
        rectangle 
        (axis cs:{\i+0.5},{0.25*exp((\i-1)*ln(0.75))})
        }; %Rechtecke; es gilt: P(X=k)=p(1-p)^(k-1)

        \end{axis}
    \end{tikzpicture}
\end{minipage}
\begin{minipage}{0.5\textwidth}
\centering
    \begin{tikzpicture}
        \begin{axis}[
        axis lines=middle,
        xmin=0,
        xmax=6,
        height=6cm,
        width=8cm,
        xlabel=$x$,
        ylabel=$F(x)$,
        xlabel style=right,
        ylabel style=above,
        enlargelimits=0.05,         
        ymin=0,
        ymax=1.5
        ]
        \pgfmathsetmacro{\LastHeight}{0}

        \pgfplotsinvokeforeach{1,...,5}{
        \pgfmathsetmacro{\ActualHeight}{0.25*exp((#1-1)*ln(0.75))+\LastHeight}
        \draw[red,thick](axis cs:{#1},{\ActualHeight}) -- (axis cs:{#1+0.5},{\ActualHeight});
        \global\let\LastHeight\ActualHeight

        }

        \end{axis}
    \end{tikzpicture}
\end{minipage}
\end{figure}

\end{document}

Ich hoffe sehr, dass meine Frage verständlich formuliert ist. Vielen Dank für die Antworten und viele Grüße!

gefragt 05 Jan, 16:50

Lilanarus's gravatar image

Lilanarus
31
Akzeptiert: 0%

1

Der Standard Trick ist so was wie \edef\temp{\noexpand\addplot ..., siehe z.B. hier. (Es gibt da auch eine Antwort von Christian Feuersänger, nur finde ich die grad nicht.)

(09 Jan, 15:02) Murmeltier

Öffne in Overleaf
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}

\begin{document}

\begin{figure}[h]
\begin{minipage}{0.5\textwidth}
\centering
    \begin{tikzpicture}
        \begin{axis}[
        axis lines=middle,
        xmin=0,
        xmax=5,
        height=6cm,
        width=8cm,
        ymin=0,
        ymax=0.4,
        xlabel=$x$,
        ylabel=$p_i$,
        xlabel style=right,
        ylabel style=above,
        enlargelimits=0.05,
        ]

        \draw[fill=red!20!white] \foreach   \i in {1,...,5  }{
        (axis cs:{\i-0.5},{0})
        rectangle
        (axis cs:{\i+0.5},{0.25*exp((\i-1)*ln(0.75))})
        }; %Rechtecke; es gilt: P(X=k)=p(1-p)^(k-1)

        \end{axis}
    \end{tikzpicture}
\end{minipage}
\begin{minipage}{0.5\textwidth}
\centering
    \begin{tikzpicture}
        \begin{axis}[
        axis lines=middle,
        xmin=0,
        xmax=6,
        height=6cm,
        width=8cm,
        xlabel=$x$,
        ylabel=$F(x)$,
        xlabel style=right,
        ylabel style=above,
        enlargelimits=0.05,
        ymin=0,
        ymax=1.5
        ]

        \pgfplotsinvokeforeach{1,...,5}{
        \pgfmathsetmacro{\ActualHeight}{#1*0.25*exp((#1-1)*ln(0.75))}
        \edef\next{\noexpand\draw[red,thick](axis cs:{#1},\ActualHeight) 
                   -- (axis cs:{#1+0.5},\ActualHeight);}
        \next
        }

        \end{axis}
    \end{tikzpicture}
\end{minipage}
\end{figure}

\end{document}
Permanenter link

beantwortet 06 Jan, 09:24

Ulrike%20Fischer's gravatar image

Ulrike Fischer
2.9k13

Guten Tag. Vielen Dank für die Antwort, inzwischen (nach etlichen Stunden) habe ich es selbst geschafft, eine Lösung zu finden.

Ich habe herausgefunden, dass man auch eine foreach- Schleife in axis benutzen kann, wenn man nur einen addplot Befehl darin stehen hat. Pgfmacros können dann auch hinzugefügt werden.

Als Plot nehme ich dann einfach ActualHeight und damit die Linie nur eine Einheit lang ist, stelle ich die Domain entsprechend ein.

(06 Jan, 09:31) Lilanarus

Ich empf. die mehrfach benutzten Einstellungen mit \pgfplotsset{...} zusammenzufassen.

(07 Jan, 10:06) cis
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×629
×264
×16
×1

Frage gestellt: 05 Jan, 16:50

Frage wurde angeschaut: 150 Mal

Zuletzt aktualisiert: 09 Jan, 15:02