Регулировка положения отдельных узлов в столбчатой ​​диаграмме

Регулировка положения отдельных узлов в столбчатой ​​диаграмме

Маркировка столбцов иногда находится за полосой погрешности. Поднимать их все неэлегантно, но я не нашел способа скорректировать положение отдельных узлов. Я включил третий набор столбцов, чтобы показать, что не все столбцы не маркированы (если это имеет значение). Возможно, есть другой способ установки меток, чем узлы около координат и точек 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работать только с табличными данными во внешнем файле. Помещение таблицы в макрос и передача его в исходном коде просто не срабатывает.

Обратите внимание, что пустые записи в данных таблицы должны быть просто {}.

Связанный контент