Problem mit pgfplots und Histogrammen

Problem mit pgfplots und Histogrammen

Ich habe gerade mit @Jakes pgfplots Binomialbeispielen gespielt vonhttps://tex.stackexchange.com/a/198575/4011, allerdings scheint das Histogramm je nach Gesamtdarstellung nach links oder rechts verschoben zu sein (siehe beispielsweise den Wert k=50 unten). Irgendeine Idee, was hier falsch ist? Könnte es an numerischen Fehlern von pgfplots liegen? Wie kann man das beheben?

\documentclass[tikz,convert]{standalone}

\usepackage{pgfplots}
\usetikzlibrary{patterns}
\pgfplotsset{compat=1.13}


\begin{document}

\begin{tikzpicture}[%
  declare
  function={binom(\k,\n,\p)=
    (\k <= \n)*\n!/(\k!*(\n-\k)!)*\p^\k*(1-\p)^(\n-\k) 
    ;}%
  ]
  \begin{axis}[%
    axis lines=center,%
    ymax=0.25,%
    ymin=0,%
    xmax=60,%
    samples at={0,1,...,50},%
    yticklabel style={%
      /pgf/number format/fixed,%
      /pgf/number format/fixed zerofill,%
      /pgf/number format/precision=1,%
      /pgf/number format/use comma },%
    ybar=0pt,bar width=0.5,%
    xlabel=$k$,%
    ylabel=$B_{n,p}(k)$, minor x tick num=0, ymajorgrids,
    width=15cm, height=6cm]
    \addplot [fill=gray!50, fill opacity=0.5]
    {binom(x,50,0.9)};%
  \end{axis}
\end{tikzpicture}
\begin{tikzpicture}[%
  declare
  function={binom(\k,\n,\p)=
    (\k <= \n)*\n!/(\k!*(\n-\k)!)*\p^\k*(1-\p)^(\n-\k) 
    ;}%
  ]
  \begin{axis}[%
    axis lines=center,%
    ymax=0.25,%
    ymin=0,%
    xmax=60,%
    samples at={0,1,...,50},%
    yticklabel style={%
      /pgf/number format/fixed,%
      /pgf/number format/fixed zerofill,%
      /pgf/number format/precision=1,%
      /pgf/number format/use comma },%
    ybar=0pt,bar width=0.5,%
    xlabel=$k$,%
    ylabel=$B_{n,p}(k)$, minor x tick num=0, ymajorgrids,
    width=15cm, height=6cm]
    \addplot [fill=black, fill opacity=0.5] {binom(x,50,0.7)};%
    \addplot [fill=gray!50, fill opacity=0.5]
    {binom(x,50,0.9)};%
  \end{axis}
\end{tikzpicture}

\begin{tikzpicture}[%
  declare
  function={binom(\k,\n,\p)=
    (\k <= \n)*\n!/(\k!*(\n-\k)!)*\p^\k*(1-\p)^(\n-\k) 
    ;}%
  ]
  \begin{axis}[%
    axis lines=center,%
    ymax=0.25,%
    ymin=0,%
    xmax=60,%
    samples at={0,1,...,50},%
    yticklabel style={%
      /pgf/number format/fixed,%
      /pgf/number format/fixed zerofill,%
      /pgf/number format/precision=1,%
      /pgf/number format/use comma },%
    ybar=0pt,bar width=0.5,%
    xlabel=$k$,%
    ylabel=$B_{n,p}(k)$, minor x tick num=0, ymajorgrids,
    width=15cm, height=6cm]

    \addplot [fill=gray!50, fill opacity=0.5]
    {binom(x,50,0.9)};%
    \addplot [fill=black, fill opacity=0.5] {binom(x,50,0.7)};%
  \end{axis}
\end{tikzpicture}
\end{center}

\end{document}

Ausgabe:

Diagramm 1

Diagramm 2

Diagramm 3

Antwort1

Kurze Antwort: Wenn Sie ybardie axisOptionen verwenden, verschiebt PGFPlots die verschiedenen Reihen, um überlappende Balken zu vermeiden. Wenn Sie nicht möchten, dass die Balken verschoben werden, legen Sie fest bar shift=0pt.


ybarin den axisOptionen, Einzelserie

Wenn Sie den ybarSchlüssel in den axisOptionen verwenden und nur eine einzelne Reihe darstellen, erhalten Sie Balken, die über den angegebenen x-Positionen zentriert sind:

\begin{axis}[
    ybar,
    ymin=0
]
    \addplot +[samples at={1,...,5}] {x};
\end{axis}


ybarin den axisOptionen, zwei Serien

Wenn Sie eine weitere Reihe hinzufügen, verschiebt PGFPlots die erste Reihe nach links und die zweite Reihe nach rechts, damit sich die Balken nicht überlappen. Standardmäßig besteht eine 2pt Lücke zwischen Balken mit derselben X-Koordinate:

\begin{axis}[
    ybar,
    ymin=0
]
    \addplot +[samples at={1,...,5}] {x};
    \addplot +[samples at={1,...,5}] {5-x};
\end{axis}


ybar=0ptin den axisOptionen, zwei Serien

Sie können die Breite der Lücke zwischen den Reihen anpassen, indem Sie ybarin den Optionen das optionale Argument für den Stil verwenden axis. Wenn Sie festlegen ybar=0pt, sind die Balken bündig zueinander:

\begin{axis}[
    ybar=0pt,
    ymin=0
]
    \addplot +[samples at={1,...,5}] {x};
    \addplot +[samples at={1,...,5}] {5-x};
\end{axis}


ybar, bar shift=0ptin den axisOptionen, zwei Serien

Wenn Sie nicht möchten, dass die Balken in verschiedene Richtungen verschoben werden, können Sie festlegen bar shift=0pt. Auf diese Weise werden Balken mit derselben x-Koordinate an derselben Stelle gezeichnet, was zu überlappenden Balken führt:

\begin{axis}[
    ybar,
    bar shift=0pt,
    ymin=0
]
    \addplot +[samples at={1,...,5}] {x};
    \addplot +[samples at={1,...,5}] {5-x};
\end{axis}

Im PGFPlots-Handbuch heißt es, dass bar shift„eine Verschiebung für xbarund konfiguriert wird ybar“ und dass der Standardwert für diesen Stil ist 0pt. Warum erhalten Sie dann unterschiedliche Ergebnisse, wenn Sie einschließen oder weglassen bar shift=0pt? Das liegt daran, dass der Aufruf ybarin den axisOptionen den Standardwert für überschreibt bar shiftund durch einen mathematischen Ausdruck ersetzt:

/pgf/bar shift={%
        % total width = n*w + (n-1)*skip
        % -> subtract half for centering
        -0.5*(\numplotsofactualtype*\pgfplotbarwidth + (\numplotsofactualtype-1)*(#1))  + 
        % the '0.5*w' is for centering
        (.5+\plotnumofactualtype)*\pgfplotbarwidth + \plotnumofactualtype*(#1)}

Dieser Ausdruck führt zu der Verschiebung, die wir in den Beispielen 2 und 3 gesehen haben. Der #1Parameter ist die Lücke zwischen den Balken ( 2ptstandardmäßig).


ybarin den \addplotOptionen, bar shift=5ptin den axisOptionen, zwei Serien

Ob der Standardwert für bar shifttatsächlich, wie im Handbuch angegeben, ist, können Sie überprüfen, indem Sie den Schlüssel aus den Optionen in die Optionen 0ptverschieben und in den Optionen einen anderen Wert für festlegen . Jetzt werden alle Balken um nach rechts verschoben :ybaraxis\addplotbar shiftaxis5pt

\begin{axis}[
    bar shift=5pt,
    ymin=0
]
    \addplot +[ybar, mark=none, fill=blue!30!white, samples at={1,...,5}] {x};
    \addplot +[ybar, mark=none, fill=red!30!white, samples at={1,...,5}] {5-x};
\end{axis}

verwandte Informationen