pgfplots:误差线忽略缺失数据

pgfplots:误差线忽略缺失数据

我的数据源包含不可绘制的数据行。更准确地说,逗号分隔的文件开头的几行内容如下:

0.0 , , , , , , , , ,
0.05, , , , , , , , ,
0.1 , , , , , , , , , 
0.15, , , , , , , , , 
0.2 , , , , , , , , , 

如果我根据这些数据绘制图表,则与 0.0 ≤ x ≤ 0.2 这些值相对应的数据点(圆圈)就会缺失。

但是,误差线画在了错误的位置。对于相同的 x 值,它们应该缺失,而对于 0.25≤x≤1,它们应该存在(就像点一样)。相反,它们被画在了 0.0≤x≤0.75。误差线向左移动了数据中空行的数量。

在此处输入图片描述

即使输入文件中的数据无法绘制,我怎样才能使误差线仍然与其数据相对应?

旁注:此外,条形的 y 位置也偏离了,但可以通过ymin=0, ymax=1明确指定 y 轴范围来修复。我省略了它以使示例更简洁。此外,这里的图像看起来被裁剪了,但这也不是问题,因为图形被修剪为仅包含可绘制数据出现的区域,即 0.25 ≤ x ≤ 1

预期输出

这是我想要实现的输出图像。上图中的圆圈在下图中用小水平线表示。

该图像还包含一个条形图和一个左侧纵坐标,这些与本问题无关(没有问题 - 为了简洁起见,我将它们省略了)。请注意,对于 x=0.2,没有绘制任何内容,既没有条形图,也没有值(圆圈/水平线)或误差线。 预期输出

平均能量损失

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}
    \begin{tikzpicture}
        \newcommand{\file}{data.csv}

        \begin{axis}[
            table/col sep=comma,
            width=10cm,
            axis y line*=right,
        ]
            \addplot [
                only marks, red!100!black,
                shift={(-4pt,0)},
                error bars/.cd, y dir=both, y explicit]
                table[
                    x={x},
                    y={5 y},
                    y error minus = {5 low err},
                    y error plus = {5 high err}
            ]{\file};
            \addplot [only marks, green!70!black,
                shift={(0,0)},
                error bars/.cd, y dir=both, y explicit
            ]
                table[
                    x={x},
                    y={7 y},
                    y error minus={7 low err},
                    y error plus ={7 high err}
            ]{\file};
            \addplot [only marks, blue!100!white,
                shift={(4pt,0)},
                error bars/.cd,y dir=both, y explicit,
            ]
                table[
                    x={x},
                    y={10 y},
                    y error minus = {10 low err},
                    y error plus ={10 high err},
            ]{\file};
        \end{axis}
    \end{tikzpicture}

\end{document}

数据文件

数据以逗号分隔值的形式提供。第一列包含 x 轴,其余部分将以此轴为基准进行绘制。第 4、7 和 10 列(分别为“5 y”、“7 y”和“10 y”)包含“实际”数据,在第一幅图中显示为圆圈,在第二幅图中显示为短水平线。

第 2、5 和 8 列(分别为“5 low err”、“7 low err”和“10 low err”)包含误差线的下限。第 3、6 和 9 列(分别为“5 high err”、“7 high err”和“10 high err”)包含误差线的上限

误差范围是相对于绘制的“实际”值给出的。例如,从第 7 行我们读到:在 x 位置 0.25不要绘制系列“5 y”或其相应的误差线;绘制系列“7 y”的值 0.222,以及从 0.222 到 0.222 的误差线;绘制系列“10 y”的值 0.146(圆圈),以及相对于绘制值的从 0.146−0.014(=0.132)到 0.146+0.0756(=0.2216)的误差线。

数据.csv:

x,  5 low err,  5 high err,  5 y,  7 low err,  7 high err,  7 y,  10 low err,  10 high err,  10 y
0,,,,,,,,,
0.05,,,,,,,,,
0.1,,,,,,,,,
0.15,,,,,,,,,
0.2,,,,,,,,,
0.25,,,,0,0,0.222,0.014,0.0756,0.146
0.3,,,,0.0012,0,0.223,0.031,0.0604,0.163
0.35,,,,0,0,0.222,0.0324,0.0572,0.165
0.4,,,,0.0012,0,0.223,0.0351,0.0562,0.167
0.45,0.0078,0.0001,0.312,0.0184,0.0924,0.219,0.0856,0.1201,0.192
0.5,0.2493,0.5171,0.458,0.2493,0.5171,0.458,0.2493,0.5171,0.458
0.55,0.2493,0.5171,0.458,0.2493,0.5171,0.458,0.2493,0.5171,0.458
0.6,0,0,0.975,0,0,0.975,0,0,0.975
0.65,0,0,0.975,0,0,0.975,0,0,0.975
0.7,0,0,0.975,0,0,0.975,0,0,0.975
0.75,0,0,0.975,0,0,0.975,0,0,0.975
0.8,0,0,0.975,0,0,0.975,0,0,0.975
0.85,0,0,0.975,0,0,0.975,0,0,0.975
0.9,0,0,0.975,0,0,0.975,0,0,0.975
0.95,0,0,0.975,0,0,0.975,0,0,0.975
1,0,0,0.975,0,0,0.975,0,0,0.975

答案1

我不能 100% 确定我是否理解了你的问题,所以首先猜测一下这是否是你的意思。如果是,我很乐意添加评论来解释解决方案的工作原理。

% used PGFPlots v1.16
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        width=25cm,
        height=10cm,
        xmin=0.25,
        enlarge x limits={abs=0.025},
        axis y line*=right,
        ybar,
        table/col sep=comma,
        table/x={x},
        error bars/y dir=both,
        error bars/y explicit,
        cycle list={
            {red!100!black,fill=.!30},
            {green!70!black,fill=.!30},
            {blue!100!white,fill=.!30},
        },
    ]
        \addplot table [
            y={5 y},
            y error minus={5 low err},
            y error plus={5 high err}
        ] {data.csv};

        \addplot table [
            y={7 y},
            y error minus={7 low err},
            y error plus={7 high err}
        ]{data.csv};

        \addplot table [
            y={10 y},
            y error minus={10 low err},
            y error plus={10 high err},
        ]{data.csv};
    \end{axis}
\end{tikzpicture}
\end{document}

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

答案2

事实证明,命令shift的选项addplot格式不正确。y 坐标缺少单位。奇怪的是,这并没有在输出中产生错误或警告。更改shift={(4pt,0)}(等等)以shift={(4pt,0pt)}产生预期的输出:错误栏绘制在与数据点相同的 x 位置。

相关内容