我有来自 5 个独立实验的 4 种物质(类别)的数据。GraphPad Prism 提供一种图表类型(见图),其中显示了带有一些抖动、平均值和误差线的散点图。
我使用了 Jake 的解决方案话题作为起点,并提出了作为最小工作示例所示的代码:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8,
jitter/.style={
x filter/.code={\pgfmathparse{\pgfmathresult+rnd*#1}}
},
jitter/.default=0.1
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[symbolic x coords={A,B,C,D}, xtick={A,B,C,D},scatter/classes={
A={mark=square*,blue},
B={mark=triangle*,red},
C={mark=o,draw=black},
D={mark=*,draw=black}},];
\addplot +[scatter,only marks,
scatter src=explicit symbolic,jitter=0.5,only marks,] coordinates {
(A,10) [A]
(A,12) [A]
(A,13) [A]
(A,11) [A]
(A,15) [A]
(B,90) [B]
(B,69) [B]
(B,75) [B]
(B,80) [B]
(B,85) [B]
(C,10) [C]
(C,5) [C]
(C,6) [C]
(C,7) [C]
(C,8) [C]
(D,40) [D]
(D,50) [D]
(D,45) [D]
(D,66) [D]
(D,39) [D]
};
\addplot[%
red,
only marks,
mark=-,%
error bars/.cd,%
y dir=both, y explicit,%
] table[col sep=tab,y error=sd,] {
sample mean sd
A 12.200 1.923538
B 79.800 8.228001
C 7.200 1.923538
D 48.000 10.97725
};%
\end{axis}
\end{tikzpicture}
\end{document}
问题在于:
1. 由于抖动导致向右偏移。这些点应该以符号 x 标记的位置为中心。
平均值的标记线太短了。它应该比每个类别的点的散点长一点。
误差线太短了,两端应该长一点。我确信,我自己可以用“误差线样式”来解决这个问题。但如果有人已经知道如何做到这一点并分享他/她的知识,我将不胜感激。
--> 我通过定义以下内容解决了 1.+3. 此问题:
\pgfdeclareplotmark{(-)}
{\draw[line width=0.4mm, black] (-30,0) -- (30,0);}
\pgfdeclareplotmark{(--)}
{\draw[line width=0.4mm, black] (-20,0) -- (20,0);}
并将前者作为标记符号,后者作为错误标记。
任何建议都将非常感谢。
答案1
感谢 Torbjorn T. 的评论,我能够自己解决这个问题。我非常感激,下面是最终代码及其输出,如图所示:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8,
jitter/.style={
x filter/.code={\pgfmathparse{\pgfmathresult+rand*#1}}
},
jitter/.default=0.1
}
\pgfdeclareplotmark{(-)}
{\draw[line width=0.4mm, black] (-25,0) -- (25,0);}
\pgfdeclareplotmark{(--)}
{\draw[line width=0.4mm, black] (-15,0) -- (15,0);}
\begin{document}
\begin{tikzpicture}
\begin{axis}[symbolic x coords={A,B,C,D}, xtick={A,B,C,D},scatter/classes={
A={mark=diamond*, draw=black, fill=blue},
B={mark=diamond*, draw=black, fill=orange},
C={mark=diamond*, draw=black, fill=black},
D={mark=diamond*, draw=black, fill=green}},];
\addplot +[scatter,only marks,
scatter src=explicit symbolic,jitter=0.2,only marks,] coordinates {
(A,10) [A]
(A,12) [A]
(A,13) [A]
(A,11) [A]
(A,15) [A]
(B,90) [B]
(B,69) [B]
(B,75) [B]
(B,80) [B]
(B,85) [B]
(C,10) [C]
(C,5) [C]
(C,6) [C]
(C,7) [C]
(C,8) [C]
(D,40) [D]
(D,50) [D]
(D,45) [D]
(D,66) [D]
(D,39) [D]
};
\addplot[%
black,
only marks,
mark=(-),%
error bars/.cd,%
y dir=both, y explicit,error mark=(--), error bar style={line width=.4mm},%
] table[col sep=tab,y error=sd,] {
sample mean sd
A 12.200 1.923538
B 79.800 8.228001
C 7.200 1.923538
D 48.000 10.97725
};%
\end{axis}
\end{tikzpicture}
\end{document}