Маркировка столбцов иногда находится за полосой погрешности. Поднимать их все неэлегантно, но я не нашел способа скорректировать положение отдельных узлов. Я включил третий набор столбцов, чтобы показать, что не все столбцы не маркированы (если это имеет значение). Возможно, есть другой способ установки меток, чем узлы около координат и точек 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}
решение1
Основной метод сделать это — использовать ключ, visualization depends on
считанный из значения ошибки, выполнить над ним некоторые вычисления и сохранить результат в макросе, например \myshift
. Затем вы можете сместить каждый узел на \myshift
. Поскольку ваши данные об ошибках поступают из разных столбцов, их visualization depends on
необходимо добавить к каждому графику при загрузке таблицы. Я решил умножить ошибку на фиксированный коэффициент ( 4
), чтобы определить сдвиг; вы можете использовать другой алгоритм.
\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}
Похоже, это ошибка, так как я смог заставить макрос \thisrow
работать только с табличными данными во внешнем файле. Помещение таблицы в макрос и передача его в исходном коде просто не срабатывает.
Обратите внимание, что пустые записи в данных таблицы должны быть просто {}
.