pgfplots 在混合图(有和没有误差线)的情况下错误地计算 \pgfplots@data@xmin

pgfplots 在混合图(有和没有误差线)的情况下错误地计算 \pgfplots@data@xmin

这篇 TUGBoat 文章作者展示了如何使用 pgfplots 实现 tufte 样式图。

目前我正在使用 Lualatex、texlive 2015。

在以下 MWE 中,我实现了论文中的想法。但是,有时我想固定图的 xmin、xmax、ymax 和 ymin,保持由 data@xmin、data@xmax 等给出的轴长度。但是观察到以下行为:

  1. 如果仅绘制带有误差线的数据,则结果是良好的(在 MWE 中,注释掉第二个图)。
  2. 如果仅绘制没有错误条的数据,则编译将永远进行并且永不停止。(在 MWE 中注释掉第一个图)

  3. 如果将它们绘制在一起,代码可以正常工作,但黑轴长度是错误的,如图所示。y 黑线应该上升到红线的 ymax,x 线也是如此。

平均能量损失

我该如何解决 2. 和 3.?

梅威瑟:

\documentclass{standalone}
\usepackage{verbatim}
\usepackage{pgfplots}
\usepackage{lmodern}
\pgfplotsset{compat = newest}

\pgfplotsset{
  every axis legend/.append style =
    {
      cells = { anchor = east },
      draw  = none
    },
}

\makeatletter
\pgfplotsset{
  tufte axes/.style =
    {
      after end axis/.code =
        {
          \draw ({rel axis cs:0,0} -| {axis cs:\pgfplots@data@xmin,0})      -- ({rel axis cs:0,0}  -| {axis cs:\pgfplots@data@xmax,0});
          \draw ({rel axis cs:0,0} |- {axis cs:0,\pgfplots@data@ymin})            -- ({rel axis cs:0,0}  |-{axis cs:0,\pgfplots@data@ymax});
                 },
      axis line style = {draw = none},
      tick align      = outside,
      tick pos        = left
    },
}
\makeatother


\begin{document}


\begin{tikzpicture}


\pgfplotsset{every axis plot post/.append style={mark=none}}
\pgfplotsset{every axis plot post/.append style={line width=1.pt}}
\begin{axis}[tufte axes,ylabel near ticks,scaled y ticks=false,ymajorgrids,unbounded coords=jump,legend pos= outer north east,legend style={font=, line width=1.pt}, xmin=6.,xmax=11,ymin=5000,ymax=7000,
xlabel={x},
ylabel={y},]
%
\addplot+[thick,mark size=2,error bars/.cd,y dir=both,y explicit]
coordinates {

(7.846, 5614.5) +- (110., 110.)
(8.096, 5530.) +- (69., 69.)
(8.65, 5442.) +- (57., 57.)
};
\addlegendentry{a}

\addplot+[thick,mark=none]
coordinates {
(7.5, 6319.2)
(9.03, 5996.6)
};
\addlegendentry{b}
\end{axis}
\end{tikzpicture}
\end{document}

答案1

这不是一个真正的答案,而是一个解决方法。

使用

\pgfplotsset{error bars/.cd,error mark=none,y dir=both}

它强制 pgfplots 绘制不可见的误差线,这样它就不会无限期地挂起并计算正确的 xmin、xmax。然后,真正的误差线图应该包含error mark=-在选项中。

正确结果:

在此处输入图片描述

完整代码

\documentclass{standalone}
\usepackage{verbatim}
\usepackage{pgfplots}
\usepackage{lmodern}
\pgfplotsset{compat = newest}

\pgfplotsset{
  every axis legend/.append style =
    {
      cells = { anchor = east },
      draw  = none
    },
}

\makeatletter
\pgfplotsset{
  tufte axes/.style =
    {
      after end axis/.code =
        {
          \draw ({rel axis cs:0,0} -| {axis cs:\pgfplots@data@xmin,0})      -- ({rel axis cs:0,0}  -| {axis cs:\pgfplots@data@xmax,0});
          \draw ({rel axis cs:0,0} |- {axis cs:0,\pgfplots@data@ymin})            -- ({rel axis cs:0,0}  |-{axis cs:0,\pgfplots@data@ymax});
                 },
      axis line style = {draw = none},
      tick align      = outside,
      tick pos        = left
    },
}
\makeatother


\begin{document}


\begin{tikzpicture}

\pgfplotsset{error bars/.cd,error mark=none,y dir=both}
\pgfplotsset{every axis plot post/.append style={mark=none}}
\pgfplotsset{every axis plot post/.append style={line width=1.pt}}
\begin{axis}[tufte axes,ylabel near ticks,scaled y ticks=false,ymajorgrids,unbounded coords=jump,legend pos= outer north east,legend style={font=, line width=1.pt}, xmin=6.,xmax=11,ymin=5000,ymax=7000,
xlabel={x},
ylabel={y},]
%
\addplot+[thick,mark size=2,error bars/.cd,y dir=both,y explicit,error mark=- ]
coordinates {

(7.846, 5614.5) +- (110., 110.)
(8.096, 5530.) +- (69., 69.)
(8.65, 5442.) +- (57., 57.)
};
\addlegendentry{a}

\addplot+[thick,mark=none]
coordinates {
(7.5, 6319.2)
(9.03, 5996.6)
};
\addlegendentry{b}
\end{axis}
\end{tikzpicture}
\end{document}

相关内容