我不太熟悉 pgfplots 中的箱线图。但现在我必须做一些。第一个结果很好,有 3 个箱子及其相应的数据。我想将此代码重用于另一个带有 2 个箱子的箱线图。现在出现了 2 个问题。
- 数据和框不再重叠,而是移到了一边。
- 经过多次尝试,我能想到的唯一解决方案是添加一个虚拟框并用 隐藏它
draw=none
。但是我有这个额外的 x 轴刻度,我无法摆脱它。
我基本上不太明白盒子的位置是如何决定的。我以为1箱线图中的坐标与标记图中的(1, 3.9)
坐标相同(例如(1,4.1)
)。但事实似乎并非如此。
有没有比添加虚拟箱线图更好的解决方案以及如何摆脱额外的 x 刻度?
谢谢。
梅威瑟:
\documentclass[border=0.5cm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title=\textbf{Title},
legend style={at={(0.12,0.98)},anchor=north,font=\tiny},
legend cell align={left},
ybar=0.7cm,
xticklabels={\textbf{data 1 [n=7]}, \textbf{data 2 [n=7]}},
x tick label style={rotate=45, anchor=north east, inner sep=1mm,font=\small},
ylabel={\textbf{\small concentration}},
bar width=1cm,
grid=none,
ymin=0,
ymax=15,
]
\addplot[black,thick,error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(1, 3.9)+- (1.2,1.2)};
\addplot[red,thick,error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(1, 1.6)+- (0.4,0.4)};
% \addplot[draw=none]
% plot coordinates {(1, 1)};
\legend{data 1, data 2}
\addplot+[mark=o,only marks,xshift=-1.7cm,black] coordinates
{(1,4.1) (1,1.2) (1,2.4) (1,13.1) (1,2.5) (1,2.0) (1,1.7)};
\addplot+[mark=o,only marks,red] coordinates
{(1,1.1) (1,2.0) (1,3.3) (1,2.5) (1,1.4) (1,2.2) (1,1.2)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
条形图会自动移动,不会重叠。您可以使用 调整其位置bar shift=...
。
我希望您有充分的理由将绘图移动 1.7 厘米。这是一种非常糟糕的数据移动方式,只会导致问题。
\documentclass[border=0.5cm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title=\textbf{Title},
legend style={at={(0.12,0.98)},anchor=north,font=\tiny},
legend cell align={left},
ybar=0.7cm,
x tick label style={rotate=45, anchor=north east, inner sep=1mm,font=\small},
ylabel={\textbf{\small concentration}},
bar width=1cm,
grid=none,
ymin=0,
ymax=15,
xtick= {-10,1},
xticklabels={\textbf{data 1 [n=7]}, \textbf{data 2 [n=7]}},
xmin=-22, xmax=22,
]
\addplot[black,thick, bar shift=-1.7 cm, error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(1, 3.9)+- (1.2,1.2)};
\addplot[red,thick, bar shift=0 cm, error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(1, 1.6)+- (0.4,0.4)};
% \addplot[draw=none]
% plot coordinates {(1, 1)};
\legend{data 1, data 2}
\addplot+[mark=o,only marks,xshift=-1.7cm,black] coordinates
{(1,4.1) (1,1.2) (1,2.4) (1,13.1) (1,2.5) (1,2.0) (1,1.7)};
\addplot+[mark=o,only marks,red] coordinates
{(1,1.1) (1,2.0) (1,3.3) (1,2.5) (1,1.4) (1,2.2) (1,1.2)};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
最后,找到了一个最适合我的解决方案:我ybar
从轴环境中删除并添加了xtick= {0,1}
, xmin=-1
, xmax=2
。其余部分请参阅下面的代码。
\documentclass[border=0.5cm]{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
legend style={at={(0.12,0.98)},anchor=north},
legend cell align={left},
xticklabels={\textbf{data 1}, \textbf{data 2}},
x tick label style={rotate=45, anchor=north east, inner sep=1mm},
ylabel={\textbf{concentration}},
bar width=1cm,
grid=none,
ymin=0,
ymax=16,
xtick= {0,1},
xmin=-1,
xmax=2,
]
\addplot[mark=o,only marks,black] coordinates
{(0,4.1) (0,1.2) (0,2.4) (0,13.1) (0,2.5) (0,2.0) (0,1.7)};
\addplot[mark=o,only marks,red] coordinates
{(1,1.1) (1,2.0) (1,3.3) (1,2.5) (1,1.4) (1,2.2) (1,1.2)};
\addplot[ybar,black,thick,error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(0, 4.2)+- (1.8,1.8)};
\addplot[ybar,red,thick,error bars/.cd,y dir=both,y explicit,error bar style={line width=1pt},
error mark options={
rotate=90,
mark size=5pt,
line width=1pt
}]
plot coordinates {(1, 1.7)+- (0.3,0.3)};
\legend{data 1, data 2}
\end{axis}
\end{tikzpicture}
\end{document}