Die Beschriftung der Balken liegt manchmal hinter dem Fehlerbalken. Sie alle anzuheben ist nicht elegant, aber ich habe keine Möglichkeit gefunden, die Positionen der einzelnen Knoten anzupassen. Ich habe den dritten Satz Balken nur aufgenommen, um zu zeigen, dass nicht alle Balken unbeschriftet sind (falls das einen Unterschied machen würde). Vielleicht gibt es eine andere Möglichkeit, die Beschriftungen festzulegen, als die Knoten in der Nähe von Koordinaten- und Punktmetadaten.
\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}
Antwort1
Die wichtigste Technik hierfür besteht darin, den Schlüssel zu verwenden, visualization depends on
den Fehlerwert zu lesen, einige Berechnungen damit durchzuführen und das Ergebnis in einem Makro zu speichern, z. B. \myshift
. Dann können Sie jeden Knoten um verschieben \myshift
. Da Ihre Fehlerdaten aus verschiedenen Spalten stammen, visualization depends on
muss beim Laden der Tabelle jeder Plot hinzugefügt werden. Ich habe mich dafür entschieden, den Fehler mit einem festen Faktor ( ) zu multiplizieren, 4
um die Verschiebung zu bestimmen; Sie möchten vielleicht einen anderen Algorithmus verwenden.
\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}
Es scheint ein Fehler zu sein, da ich das \thisrow
Makro nur mit Tabellendaten in einer externen Datei zum Laufen bringen konnte. Das Einfügen der Tabelle in ein Makro und die Übergabe wie in Ihrem Originalcode schlägt einfach fehl.
Beachten Sie, dass leere Einträge in Ihren Tabellendaten einfach sein sollten {}
.