Ajuste de la posición de nodos individuales en el gráfico de barras

Ajuste de la posición de nodos individuales en el gráfico de barras

El etiquetado de las barras a veces se encuentra detrás de la barra de error. Levantarlos todos no es elegante, pero no he encontrado una manera de ajustar las posiciones de los nodos individuales. Incluí el tercer conjunto de barras solo para mostrar que no todas las barras están etiquetadas (si eso marcara la diferencia). Quizás haya otra forma de configurar las etiquetas además de los nodos cerca de coord y point meta.

      \documentclass{book}
      \usepackage{caption}
      \usepackage{pgfplots}
      \usepackage{booktabs}
      \usepackage{pgfplotstable}

      \begin{document}
      \definecolor{gray}{cmyk}{0,0,0,0.1}
      \definecolor{gray1}{cmyk}{0,0,0,0.3}
      \definecolor{gray2}{cmyk}{0,0,0,0.5}
      \definecolor{gray3}{cmyk}{0,0,0,0.7}

      \begin{figure}[htb]
      \begin{minipage}{\textwidth}
      \pgfplotstableread{
       x    y1  y1_err  y2  y2_err  y3  y3_err  y4  y4_err meta1 meta2 meta3 meta4
       A    100 0.1 100 0.1 81  7   87  5 a a b b 
       B    100 0.1 100 0.1 83  8   97  2 a a b a 
       C    84  2   87  2   86  4   93  1 \phantom{} \phantom{} \phantom{} \phantom{} 
        }\loadedtable
        \pgfplotsset{width=18cm,compat=1.9}
        \centering
        \begin{tikzpicture}
        \begin{axis}[ybar,
        ylabel={\%}, 
        symbolic x coords={A,B,C},
        xtick={A,B,C},
        ymin=0,
        ymax=110,
        nodes near coords, 
        every node near coord/.append style={yshift=0.2cm},    
        point meta=explicit symbolic,  
        ]
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray]table[
        meta index=9,
        x=x,
        y=y1,
        y error=y1_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray1]table[
        meta index=10,
        x=x,
        y=y2,
        y error=y2_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray2]table[
        meta index=11,
        x=x,
        y=y3,
        y error=y3_err,
        ]{\loadedtable};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit
        ][black,fill=gray3]table[
        meta index=12,
        x=x,
        y=y4,
        y error=y4_err,
        ]{\loadedtable};
       \end{axis}
      \end{tikzpicture}
     \end{minipage}
    \end{figure}
    \end{document}

Respuesta1

La técnica principal para hacer esto es usar la clave visualization depends onleída en el valor de error, hacer algunos cálculos y guardar el resultado en una macro, por ejemplo \myshift. Luego puedes desplazar cada nodo \myshift. Como los datos de error provienen de diferentes columnas, es visualization depends onnecesario agregarlos a cada gráfico cuando carga la tabla. He optado por multiplicar el error por un factor fijo ( 4) para determinar el desplazamiento; es posible que desee utilizar un algoritmo diferente.

Salida de muestra

\documentclass{book}

\usepackage{caption}
\usepackage{pgfplots}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\pgfplotsset{compat=1.14}

\begin{document}
\definecolor{gray}{cmyk}{0,0,0,0.1}
\definecolor{gray1}{cmyk}{0,0,0,0.3}
\definecolor{gray2}{cmyk}{0,0,0,0.5}
\definecolor{gray3}{cmyk}{0,0,0,0.7}

\begin{filecontents}{mytab.dat}
x y1 y1_err y2 y2_err y3 y3_err y4 y4_err meta1 meta2 meta3 meta4
A 100 0.1 100 0.1 81 7 87 5 a a b b
B 100 0.1 100 0.1 83 8 97 2 a a b a
C 84 2 87 2 86 4 93 1 {} {} {} {}
\end{filecontents}

\begin{figure}[htb]
  \begin{minipage}{\textwidth}
    \pgfplotsset{width=18cm}
    \centering
    \begin{tikzpicture}
      \begin{axis}[ybar,
        ylabel={\%},
        symbolic x coords={A,B,C},
        xtick={A,B,C},
        ymin=0,
        ymax=110,
        nodes near coords,
        nodes near coords style={yshift=\myshift},
        point meta=explicit symbolic,
        ]
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit][black,fill=gray]table[
        meta index=9,
        x=x,
        y=y1,
        y error=y1_err,
        visualization depends on=4*\thisrow{y1_err} \as \myshift,
        ] {mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray1]table[
        meta index=10,
        x=x,
        y=y2,
        y error=y2_err,
        visualization depends on=4*\thisrow{y2_err} \as \myshift,
        ]{mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray2]table[
        meta index=11,
        x=x,
        y=y3,
        y error=y3_err,
        visualization depends on=4*\thisrow{y3_err} \as \myshift,
        ]{mytab.dat};
        \addplot+[error bars/.cd,
        y dir=both,
        y explicit ][black,fill=gray3]table[
        meta index=12,
        x=x,
        y=y4,
        y error=y4_err,
        visualization depends on=4*\thisrow{y4_err} \as \myshift,
        ]{mytab.dat};
      \end{axis}
    \end{tikzpicture}
  \end{minipage}
\end{figure}
\end{document}

Parece ser un error, ya que solo pude hacer que la \thisrowmacro funcionara con datos de tabla en un archivo externo. Poner la tabla en una macro y pasarla como en su código original simplemente falla.

Tenga en cuenta que las entradas en blanco en los datos de su tabla deben ser simplemente {}.

información relacionada