Problema con pgfplots e histogramas

Problema con pgfplots e histogramas

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:

Diagrama 1

Diagrama 2

Diagrama 3

Respuesta1

Respuesta corta: cuando se usa ybaren las axisopciones, PGFPlots cambiará las diferentes series para evitar barras superpuestas. Si desea que las barras no se desplacen, establezca bar shift=0pt.


ybaren las axisopciones, serie única

Si usa la ybarclave en las axisopciones 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}


ybaren las axisopciones, 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=0pten las axisopciones, dos series

Puede ajustar el ancho del espacio entre las series utilizando el argumento opcional del ybarestilo en las axisopciones. 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=0pten las axisopciones, 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 xbary 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 ybara las axisopciones sobrescribe el valor predeterminado bar shifty 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 #1parámetro es el espacio entre las barras ( 2ptpor defecto).


ybaren las \addplotopciones, bar shift=5pten las axisopciones, dos series

Puede comprobar que el valor predeterminado de bar shiftes, como dice el manual, 0ptmoviendo la ybartecla de axisopciones a \addplotopciones y estableciendo un valor diferente bar shiften las axisopciones. 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}

información relacionada