如何根据轴的值突出显示 Pgfplots 图中的区域?

如何根据轴的值突出显示 Pgfplots 图中的区域?

我想突出显示下面两个测量值(用点和误差线表示)一致的区域:

带有一致区域的误差线。

这是我正在使用的代码:

\documentclass[a4paper,10pt]{book}

\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}[xmin=30,xmax=70,ymin=0,ymax=3,unit vector ratio=1 2,ytick=\empty,xtick={30,40,...,70}]
\addplot +[blue,scatter,only marks,
scatter src=explicit symbolic,
error bars/.cd, 
y dir=both,y explicit,x dir=both,x explicit] 
table[row sep=crcr, x index=0, y index=1, x error index=2, y error index=3, meta index=4 ] 
{45  1   5  0  1\\  
 56  2   8  0  2\\};
\end{axis}
\end{tikzpicture}

\end{document}

答案1

这里有三种方法可以做到这一点。我假设您想要突出显示轴的整个高度,如果您不需要那么就不用太费劲了,只需使用合理的 y 值即可。

一般来说,你可以axis cs使用轴坐标系来放置东西,例如\draw (axis cs:1,1) -- (axis cs:1,2);。但是,如果你添加\pgfplotsset{compat=1.11}(或更新版本,最新版本是 1.12)axis cs是默认的,那么你会得到相同的结果\draw (1,1) -- (1,2);。这当然适用于放置在环境内的路径axis

另一个有用的功能是,你可以使用 获得轴限值,对于、和 也\pgfkeysvalueof{/pgfplots/ymin}类似。这引出了三个选项中的第一个:ymaxxminxmax

\fill [red,opacity=0.3] (48,\pgfkeysvalueof{/pgfplots/ymin}) rectangle (50,\pgfkeysvalueof{/pgfplots/ymax});

这种方法的一个变体是利用轴框是名为 的节点这一事实current axis。这可以与垂直坐标系一起使用以获得相同的效果:

\fill [pattern=north east lines,opacity=0.2] (48,0 |-current axis.south east) rectangle (50,0 |-current axis.north west);

写入时,(50,0 |- current axis.north)您将获得 x 坐标为 (50,0) 和 y 坐标为 的坐标current axis.north。换句话说,|-在这种情况下意味着“从第一个坐标绘制一条垂直线,从第二个坐标绘制一条水平线,并使用它们的交点”。

第三种方式使用\addplot,因此compat不需要进行任何设置:

\addplot [pattern=north west lines,densely dotted,opacity=0.6] coordinates {
         (48,\pgfkeysvalueof{/pgfplots/ymax})
         (50,\pgfkeysvalueof{/pgfplots/ymax})
        }
        \closedcycle;

我使用与上面相同的两个坐标\fill,并\closedcycle在末尾添加。\closedcycle表示曲线下的区域被填充。

其他说明:

  • patterns库仅被加载以获得两种不同的pattern填充,我使用它们只是为了能够一并说明所有内容。

  • backgrounds库提供了on background layer用于scope环境的选项。它的作用正如您所想的那样,它将路径放在了scope其他内容的下方。

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{backgrounds,patterns}
\pgfplotsset{compat=1.12}
\begin{document}

\begin{tikzpicture}
\begin{axis}[xmin=30,xmax=70,ymin=0,ymax=3,unit vector ratio=1 2,ytick=\empty,xtick={30,40,...,70}]
\addplot +[blue,scatter,only marks,
scatter src=explicit symbolic,
error bars/.cd, 
y dir=both,y explicit,x dir=both,x explicit] 
table[row sep=crcr, x index=0, y index=1, x error index=2, y error index=3, meta index=4 ] 
{45  1   5  0  1\\  
 56  2   8  0  2\\};

\begin{scope}[on background layer]
\fill [red,opacity=0.3] (48,\pgfkeysvalueof{/pgfplots/ymin}) rectangle (50,\pgfkeysvalueof{/pgfplots/ymax});

\fill [pattern=north east lines,opacity=0.2] (48,0 |-current axis.south) rectangle (50,0 |-current axis.north);

\addplot [pattern=north west lines,densely dotted,opacity=0.6] coordinates {(48,\pgfkeysvalueof{/pgfplots/ymax}) (50,\pgfkeysvalueof{/pgfplots/ymax})} \closedcycle;
\end{scope}
\end{axis}
\end{tikzpicture}
\end{document}

相关内容