我想制作一个带有多个带误差线的图。每条曲线有 1100 个点。我想只绘制几个 (5) 个误差线以增加可读性。出于同样的原因,我希望每组误差线偏移不同的间隔。例如:
图 1:误差线在 0、250、500、750、1000 处;图 2:误差线在 10、260、510、760、1010 处;图 3:误差线在 20、270、520、770、1020 处;等等。
我目前的尝试是:
\pgfplotsset{err/.style={each nth point={250},forget plot,draw=none}}
\pgfplotsset{errp/.style={err, error bars/.cd,y dir=plus, y explicit}}
\pgfplotsset{errm/.style={err, error bars/.cd,y dir=minus, y explicit}}
% plot 1
\addplot+[errm] table[x index=0,y index=1, y error index=2}]{\table};
\addplot+[errp] table[x index=0,y index=1, y error index=3}]{\table};
\addplot table[x index=0,y index=1]{\table};
% plot 2
\addplot+[skip coords between index={0}{10}, errm] table[x index=0,y index=4, y error index=5}]{\table};
\addplot+[skip coords between index={0}{10}, errp] table[x index=0,y index=4, y error index=6}]{\table};
\addplot table[x index=0,y index=4]{\table};
% plot 3
\addplot+[skip coords between index={0}{20}, errm] table[x index=0,y index=7, y error index=8}]{\table};
\addplot+[skip coords between index={0}{20}, errp] table[x index=0,y index7, y error index=9}]{\table};
\addplot table[x index=0,y index=7]{\table};
% etc.
它each nth point={250}
按照我想要的方式运行,但是skip coords between index={0}{20}
没有起作用(它只抑制了第一个错误条)。
此外,编译时间非常长,我想知道改变我的方法是否可以减少它(我已经使用了外部化)。我的另一个尝试是生成一个只包含相关数据的错误表并绘制它们。这有点麻烦,因为每次想要改变图的外观时都需要返回数据生成。
总结:
- 如何引入 skip ?
- 有没有更简洁、更高效的代码来做到这一点?
一些数据:
第一列是横坐标。然后是 3 列数据。然后是 3 列减去误差。然后是 3 列加上误差。
这个例子:
expl.tex 是主体,graph.tex 是图形。
答案1
你可以使用
\addplot [draw=none, forget plot]
gnuplot [raw gnuplot] {plot "full.dat" using 1:2:5:8 every 300::50 with yerrorbars};
让 gnuplot 将从第 50 行开始的每 300 行的第 1、2、5 和 8 列写入名为\jobname.pgf-plot.table
。然后可以在误差线绘图命令中使用它。Gnuplot 对文件的下采样速度非常快,比 key 快得多each nth point
。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotstableread{full.dat}{\table}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{err/.style={forget plot,draw=none}}
\pgfplotsset{errp/.style={err, error bars/.cd,y dir=plus, y explicit}}
\pgfplotsset{errm/.style={err, error bars/.cd,y dir=minus, y explicit}}
\begin{axis}[
/pgfplots/table/header=false % This is necessary, otherwise the first line of each file would be assumed to not contain data, but the column names
]
\addplot [draw=none, forget plot] gnuplot [raw gnuplot] {plot "full.dat" using 1:2:5:8 every 300 with yerrorbars};
\addplot+[errm] table [y error index=2]{\jobname.pgf-plot.table};
\addplot+[errp] table [y error index=3]{\jobname.pgf-plot.table};
\addplot +[no markers] table [y index=1]{\table};
\addplot [draw=none, forget plot] gnuplot [raw gnuplot] {plot "full.dat" using 1:3:6:9 every 300::50 with yerrorbars};
\addplot+[errm] table [y error index=2]{\jobname.pgf-plot.table};
\addplot+[errp] table [y error index=3]{\jobname.pgf-plot.table};
\addplot +[no markers] table [y index=2]{\table};
\end{axis}
\end{tikzpicture}
\end{document}