是否有一种优雅的方法来创建带有平均值和误差线的分类散点图?

是否有一种优雅的方法来创建带有平均值和误差线的分类散点图?

我有来自 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. 平均值的标记线太短了。它应该比每个类别的点的散点长一点。

  2. 误差线太短了,两端应该长一点。我确信,我自己可以用“误差线样式”来解决这个问题。但如果有人已经知道如何做到这一点并分享他/她的知识,我将不胜感激。

--> 我通过定义以下内容解决了 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}

最终代码的输出

相关内容