将多个 pgftable 属性合并为一个

将多个 pgftable 属性合并为一个

这是该问题的后续内容:带有对数刻度的误差线中的误差很大

以下 MWE 绘制了一些线,并提供了expr当错误导致负值时的情况,而该负值根本不会被 pgfplots 绘制。

documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotstableread{
  x   y     y-err
  0.1 0.070 0.003
  1.1 0.026 0.001
  2.1 0.018 0.001
  3.1 0.012 0.02
}{\loadedtable}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[ymode=log, ymin=0.005, ymax=0.1,]

    \addplot+ [
    mark=diamond,
    error bars/.cd,
    y dir=both,
    y explicit,
    ] table [
    x=x,
    y=y,
    y error plus=y-err,     %% First `plus` is set to the error
    y error minus expr={    %% `minus` is set to an expression
      ifthenelse(
      \thisrow{y} - \thisrow{y-err} <= 0,
      \thisrow{y} - 1e-4,
      \thisrow{y-err}%
      )
    }] {\loadedtable};    
\end{tikzpicture}
\end{document}

有没有办法声明属性

y error plus=y-err,
y error minus expr={
  ifthenelse(
  \thisrow{y} - \thisrow{y-err} <= 0,
  \thisrow{y} - 1e-4,
  \thisrow{y-err}%
  )

作为某种样式,并在多个图中使用生成的样式?理想情况下,我希望得到这样的结果

table [x=x, y=y, y err=y-err, fix-negative] { .... }

到目前为止,通过定义

\def\yerrminus#1#2{{ifthenelse(\thisrow{#1} - \thisrow{#2} <= 0,
                               \thisrow{#1} - 1e-4,
                               \thisrow{#2})}}

我可以做到这一点

table [x=x, y=y, y err plus=y-err, 
       y err minus expr=\yerrminus{y}{y-err}] { .... }

答案1

那么像下面这样怎么样?

% used PGFPlots v1.15
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
    \pgfplotsset{
        % create a custom style for the "special" error bars
        % the three arguments require the column names of
        % - 1   x column
        % - 2   y column
        % - 3   y minus error
        my y error bar style/.style n args={3}{
            error bars/y dir=both,
            error bars/y explicit,
            table/x=#1,
            table/y=#2,
            % (nothing special needed here)
            table/y error plus=#3,
            % limit error bar to end at `ymin'
            table/y error minus expr={
                ifthenelse(
                    \thisrow{#2} - \thisrow{#3} <= 0,
                    \thisrow{#2} - 1e-4,
                    \thisrow{#3}%
                )
            },
        },
    }
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        ymode=log,
        ymin=0.005,
        ymax=0.1,
    ]
        \addplot+ [
            mark=diamond,
            % use the created style here
            % (in the `\addplot' options and not in the `table' options)
            my y error bar style={x}{y}{y-err},
        ] table {
            x y     y-err
            0 0.070 0.003
            1 0.026 0.001
            2 0.018 0.001
            3 0.012 0.02
        };
    \end{axis}
\end{tikzpicture}
\end{document}

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

相关内容