如果我改变了 x 轴,如何在图中添加水平线?

如果我改变了 x 轴,如何在图中添加水平线?

以下是我的 MWE:

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

\pgfplotstableread{
x y error 
P53     0.21    0.07 
IgG    -0.16    0.06 
cTnI    0.03    0.04 
PSA    -0.22    0.05 
Myo    -0.05    0.03 
AFP    -0.09    0.02 
Serum   0.05    0.06 
CKMB    0.89    0.01 
}\datatable

\begin{tikzpicture}
\begin{axis}[
    ybar,
    bar width=14pt,
    symbolic x coords={P53,IgG,cTnI,PSA,Myo,AFP,Serum,CKMB},
    xlabel=xlabel,
    ylabel=xlabel,
    ]
    \addplot+ [   
    error bars/.cd,
    y dir=both,
    y explicit relative, 
    ] table [y error=error] {\datatable};
    %\addplot+ (P53,0) -- (CKMB,0);
  \end{axis}
\end{tikzpicture}


\end{document}

以下是我预期的结果:

在此处输入图片描述

PS:您能告诉我 x-tick 出了什么问题吗?

答案1

使用起来extra x tick很简单:

\documentclass[margin=3.14159]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

\pgfplotstableread{%
x       y       error
P53     0.21    0.07
IgG    -0.16    0.06
cTnI    0.03    0.04
PSA    -0.22    0.05
Myo    -0.05    0.03
AFP    -0.09    0.02
Serum   0.05    0.06
CKMB    0.89    0.01
    }\datatable

    \begin{tikzpicture}
\begin{axis}[
    ybar,
    bar width=14pt,
    symbolic x coords={P53,IgG,cTnI,PSA,Myo,AFP,Serum,CKMB},
    xlabel=xlabel,
    ylabel=ylabel,
    extra y ticks=(0),  % <---
    extra y tick style={grid, % <---
                        grid style={thick, red}},
            ]
\addplot + [error bars/.cd,
            y dir=both, y explicit relative,
            ] table [y error=error] {\datatable};
\end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

我怀疑 pgfplots 只使用了每三个条形图来适应 x 刻度标签。另一方面,仅减小字体大小是不够的。

左侧和右侧最好使用 (rel axis cs:) 定义,而数据点则使用 (axis cs:) 定义。先定义命名坐标,然后找到垂线会更容易:(sw |- zero) 和 (ne |- zero)。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

\pgfplotstableread{
x y error 
P53     0.21    0.07 
IgG    -0.16    0.06 
cTnI    0.03    0.04 
PSA    -0.22    0.05 
Myo    -0.05    0.03 
AFP    -0.09    0.02 
Serum   0.05    0.06 
CKMB    0.89    0.01 
}\datatable

\begin{tikzpicture}
\begin{axis}[
    ybar,
    bar width=14pt,
    symbolic x coords={P53,IgG,cTnI,PSA,Myo,AFP,Serum,CKMB},
    xlabel=xlabel,
    ylabel=ylabel,
    xtick=data,
    x tick label style={font={\tiny}}
    ]
    \addplot+ [   
    error bars/.cd,
    y dir=both,
    y explicit relative, 
    ] table [y error=error] {\datatable};
    %\addplot+ (P53,0) -- (CKMB,0);
    \coordinate (zero) at (axis cs: P53,0);
    \coordinate (sw) at (rel axis cs: 0,0);
    \coordinate (ne) at (rel axis cs: 1,1);
  \end{axis}
  \draw[red] (sw |- zero) -- (ne |- zero);
\end{tikzpicture}
\end{document}

演示

答案3

有几种方法可以添加水平线。我认为添加线条最简单的方法是使用extra y tick,因为它独立于数据工作。

% used PGFPlots v1.17
\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
    \pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}
        \pgfplotstableread{
            x      y        error
            P53     0.21    0.07
            IgG    -0.16    0.06
            cTnI    0.03    0.04
            PSA    -0.22    0.05
            Myo    -0.05    0.03
            AFP    -0.09    0.02
            Serum   0.05    0.06
            CKMB    0.89    0.01
        }\datatable
    \begin{axis}[
        ybar,
        bar width=14pt,
        xlabel=xlabel,
        ylabel=ylabel,
%        % --------------------------------------------------------------------
%        % (much simpler than using `symbolic coords` is ...
%        symbolic x coords={P53,IgG,cTnI,PSA,Myo,AFP,Serum,CKMB},
        table/x expr=\coordindex,
        xtick=data,
        xticklabels from table={\datatable}{x},
        xticklabel style={
            rotate=90,
        },
        % ... By that you don't have to repeat yourself if "x values" change.)
        % ---------------------------------------------------------------------
        % extra line at $y = 0$
        extra y ticks={0},
        extra y tick labels={},
        extra y tick style={
            grid=major,
            grid style={
                red,
            },
        },
    ]
        \addplot+ [
            error bars/.cd,
                y dir=both,
                y explicit relative,
        ] table [y error=error] {\datatable};
    \end{axis}
\end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容