以下是我的 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}