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:
Antwort1
Kurze Antwort: Wenn Sie ybar
die axis
Optionen 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
.
ybar
in den axis
Optionen, Einzelserie
Wenn Sie den ybar
Schlüssel in den axis
Optionen 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}
ybar
in den axis
Optionen, 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=0pt
in den axis
Optionen, zwei Serien
Sie können die Breite der Lücke zwischen den Reihen anpassen, indem Sie ybar
in 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=0pt
in den axis
Optionen, 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 xbar
und 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 ybar
in den axis
Optionen den Standardwert für überschreibt bar shift
und 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 #1
Parameter ist die Lücke zwischen den Balken ( 2pt
standardmäßig).
ybar
in den \addplot
Optionen, bar shift=5pt
in den axis
Optionen, zwei Serien
Ob der Standardwert für bar shift
tatsächlich, wie im Handbuch angegeben, ist, können Sie überprüfen, indem Sie den Schlüssel aus den Optionen in die Optionen 0pt
verschieben und in den Optionen einen anderen Wert für festlegen . Jetzt werden alle Balken um nach rechts verschoben :ybar
axis
\addplot
bar shift
axis
5pt
\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}