條形的標籤有時位於誤差條後面。將它們全部提升並不優雅,但我還沒有找到調整各個節點位置的方法。我添加了第三組長條圖,只是為了表明並非所有長條圖都沒有標記(如果這會產生影響)。也許除了座標和點元附近的節點之外還有另一種設定標籤的方法。
\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
巨集處理外部文件中的表資料。將表放入巨集中並像在原始程式碼中那樣傳遞它只會失敗。
請注意,表格資料中的空白條目應該是簡單的{}
.