Acabo de jugar con los ejemplos binomiales de @Jakes pgfplots dehttps://tex.stackexchange.com/a/198575/4011, sin embargo, el histograma parece desplazarse hacia la izquierda o hacia la derecha dependiendo de todo el gráfico (observe, por ejemplo, el valor k=50 a continuación). ¿Alguna idea de qué pasa aquí? ¿Podría deberse a errores numéricos de pgfplots? ¿Como arreglarlo?
\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}
Producción:
Respuesta1
Respuesta corta: cuando se usa ybar
en las axis
opciones, PGFPlots cambiará las diferentes series para evitar barras superpuestas. Si desea que las barras no se desplacen, establezca bar shift=0pt
.
ybar
en las axis
opciones, serie única
Si usa la ybar
clave en las axis
opciones y traza solo una serie, obtendrá barras centradas sobre las posiciones x especificadas:
\begin{axis}[
ybar,
ymin=0
]
\addplot +[samples at={1,...,5}] {x};
\end{axis}
ybar
en las axis
opciones, dos series
Si agrega otra serie, PGFPlots desplazará la primera serie hacia la izquierda y la segunda serie hacia la derecha, para que las barras no se superpongan. De forma predeterminada, hay un 2pt
espacio entre barras con la misma coordenada x:
\begin{axis}[
ybar,
ymin=0
]
\addplot +[samples at={1,...,5}] {x};
\addplot +[samples at={1,...,5}] {5-x};
\end{axis}
ybar=0pt
en las axis
opciones, dos series
Puede ajustar el ancho del espacio entre las series utilizando el argumento opcional del ybar
estilo en las axis
opciones. Si configuras ybar=0pt
, las barras estarán alineadas entre sí:
\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
en las axis
opciones, dos series
Si no desea que las barras se desplacen en diferentes direcciones, puede configurar bar shift=0pt
. De esa manera, las barras con la misma coordenada x se dibujarán en la misma ubicación, lo que provocará barras superpuestas:
\begin{axis}[
ybar,
bar shift=0pt,
ymin=0
]
\addplot +[samples at={1,...,5}] {x};
\addplot +[samples at={1,...,5}] {5-x};
\end{axis}
En el manual de PGFPlots, dice que bar shift
"configura un cambio para xbar
y ybar
", y que el valor predeterminado para este estilo es 0pt
. ¿Por qué entonces obtienes resultados diferentes al incluir u omitir bar shift=0pt
? Esto se debe a que llamar ybar
a las axis
opciones sobrescribe el valor predeterminado bar shift
y lo reemplaza con una expresión matemática:
/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)}
Esa expresión conduce al cambio que vimos en los ejemplos 2 y 3. El #1
parámetro es el espacio entre las barras ( 2pt
por defecto).
ybar
en las \addplot
opciones, bar shift=5pt
en las axis
opciones, dos series
Puede comprobar que el valor predeterminado de bar shift
es, como dice el manual, 0pt
moviendo la ybar
tecla de axis
opciones a \addplot
opciones y estableciendo un valor diferente bar shift
en las axis
opciones. Ahora todas las barras se desplazan hacia la derecha 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}