用星号线显示 pgfplots 中结果的重要性

用星号线显示 pgfplots 中结果的重要性

经过一段时间的搜索,我还是没有找到满意的答案,最后我决定发布我的第一个问题。使用搜索功能,我找到了类似的问题,但给出的答案都不能令人满意。

我的问题:我使用 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}

在此处输入图片描述

相关内容