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 on
leí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 on
necesario 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.
\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 \thisrow
macro 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 {}
.