我的数据源包含不可绘制的数据行。更准确地说,逗号分隔的文件开头的几行内容如下:
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 位置。