经过一段时间的搜索,我还是没有找到满意的答案,最后我决定发布我的第一个问题。使用搜索功能,我找到了类似的问题,但给出的答案都不能令人满意。
我的问题:我使用 pgfplots 以条形图显示结果,并通过 ANOVA 和 Dunnett 多重比较检验与一个对照测试数据是否存在显著差异。我想要一些看起来像这样的东西:
我使用以下代码生成了它:
\documentclass{scrartcl}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{amsmath}%
\usepackage{tikz}%
\usepackage{pgfplots}%
\pgfplotsset{width=7cm,compat=1.7}%
\begin{document}%
\begin{tikzpicture}%
\begin{axis}[%
ybar,%
title=Test,%
axis y line=left, axis x line*=bottom,%
ymin=0, ymax=70,%
x tick label style={rotate=45,anchor=east},%
symbolic x coords={A, B, C, D, E},%
ylabel=difference in \%,%
]%
\addplot+[%
color=black,%
error bars/.cd,%
y dir=both,%
y explicit,%
]%
table[%
y error=err%
] {barexample.txt};%
\addplot[black, sharp plot]%
coordinates {(A,50) (D,50)}%
node[above] at (150,500) {***}%
;%
\addplot[black, sharp plot]%
coordinates {(A,60) (E,60)}%
node[above] at (150,600) {**}%
;%
\end{axis}%
\end{tikzpicture}%
\end{document}%
这是数据文件的内容:
xval yval err sig
A 1 0.2 control
B 10 2.5 n.s.
C 20 2.2 n.s.
D 40 4.2 ***
E 28 2.8 **
我正在寻找一种解决方案,可以检查 sig 列中的星号,如果是 *** 或 ** 或 *,则在列上方画一条线,并在该线的某个位置插入适当数量的 *。此外,应该堆叠线条,从最右边的开始,依此类推。
感谢您的帮助!
答案1
您可以使用after end axis/.code
选项和 foreach 循环逐行读取文件。使用 计算最大行数、星号和最大 y 值pgfplotstable
。
\maxvalue{barexample.txt}{yval}
\maxasterisk{barexample.txt}{sig}
\pgfplotstableread{barexample.txt}\myresult
\pgfplotstablegetrowsof{\myresult}
\pgfmathsetmacro{\N}{\pgfplotsretval-1}
您可以使用来自这答案检查您的列是否包含星号。
\documentclass{scrartcl}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{amsmath}%
\usepackage{tikz}%
\usepackage{pgfplots}%
\pgfplotsset{width=7cm,compat=1.7}%
\usepackage{pgfplotstable}
\usepackage{xstring}
\newcommand{\maxvalue}[2]{
\pgfplotstablesort[sort key={#2},sort cmp={float >}]{\result}{#1}
\pgfplotstablegetelem{0}{#2}\of{\result}
\let\ymax=\pgfplotsretval
}
\newcommand{\maxasterisk}[2]{
\pgfplotstablesort[sort cmp=string <]\result{#1}
\pgfplotstablegetelem{0}{#2}\of{\result}
\StrLen{\pgfplotsretval}[\ast]
\let\astmax=\ast
}
\makeatletter
\def\instring#1#2{TT\fi\begingroup
\edef\x{\endgroup\noexpand\in@{#1}{#2}}\x\ifin@}
\makeatother
\begin{document}
\maxvalue{barexample.txt}{yval}
\maxasterisk{barexample.txt}{sig}
\pgfplotstableread{barexample.txt}\myresult
\pgfplotstablegetrowsof{\myresult}
\pgfmathsetmacro{\N}{\pgfplotsretval-1}
\begin{tikzpicture}%
\begin{axis}[%
ybar,%
title=Test,%
axis y line=left, axis x line*=bottom,%
ymin=0, ymax=\ymax+\astmax*5,%
x tick label style={rotate=45,anchor=east},%
symbolic x coords={A, B, C, D, E},%
ylabel=difference in \%,
after end axis/.code={
\foreach \i in {0,...,\N}{
\pgfplotstablegetelem{\i}{[index] 3}\of\myresult
\let\curr\pgfplotsretval
\pgfplotstablegetelem{\i}{[index] 0}\of\myresult
\let\currid\pgfplotsretval
\if\instring{*}{\curr}
\StrLen{\curr}[\currast]
\pgfmathsetmacro{\yvalue}{\ymax+(\i+1)*5}
\draw ([yshift=-1mm]axis cs:A,\yvalue) -- (axis cs:A,\yvalue) -- node[above, yshift=-2mm]{\small\curr} (axis cs:\currid,\yvalue) -- ([yshift=-1mm]axis cs:\currid,\yvalue);
\fi
}%
}
]
\addplot+[%
color=black, %
fill=white,%
error bars/.cd,%
y dir=both,%
y explicit,%
]%
table[%
y error=err%
] {barexample.txt};
\end{axis}%
\end{tikzpicture}%
\end{document}