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 '19, 22:50

Lilanarus's gravatar image

Lilanarus
3144
Akzeptiert-Rate: 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 '19, 21:02) Community

Ö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 '19, 15:24

Ulrike%20Fischer's gravatar image

Ulrike Fischer
3.6k23
Akzeptiert-Rate: 52%

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 '19, 15:31) Lilanarus

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

(07 Jan '19, 16:06) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×298
×21
×2

gestellte Frage: 05 Jan '19, 22:50

Frage wurde gesehen: 5,862 Mal

zuletzt geändert: 09 Jan '19, 21:02