请让我更广泛地解释一下这背后的动机。我想绘制测量的基准值,如下所示:背景/x 轴和最小值之间没有任何东西 最小值和中位数之间的绿色区域 中位数处的黑线 中位数和最大值之间的红色区域 背景/最大值以上没有任何东西
我尝试过各种方法来实现这一点,但最终还是使用了在我看来非常不雅的方式,即在其他图上画一个白色区域(尽管经历了所有的痛苦之后,我想我可以忍受这一点:),下面的代码展示了这一点,以及替代解决方案应该是什么样子。
一个尝试是使用堆叠图,但当然值是堆叠的,我找不到等效的bar shift=0pt
。我还认为没有办法禁用每个图的堆叠(或反过来,即全局禁用它但为选定的图启用它)。
我能找到的最相似的解决方案是在 pgfplots 中的两条曲线之间填充。但我无法让它处理我已有的表格数据(真的没有简单的方法将选定的列复制到新表中吗!?)。下面的白色区域方法真的是最好的方法吗?
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
size min max med
1 1 3 2
10 2 4 3
}{\loadedtable}
\begin{tikzpicture}
\begin{axis}[
legend entries={above median,below median, median,},
ymin=0,
area style,
]
\addplot [fill=red!40, draw=none] table [x=size, y=max] {\loadedtable} \closedcycle;
\addplot [fill=green!40, draw=none] table [x=size, y=med] {\loadedtable} \closedcycle;
\addplot [draw=black, line legend] table [x=size, y=med] {\loadedtable};
\addplot [fill=white, draw=white] table [x=size, y=min] {\loadedtable} \closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}
答案1
您可以使用和stack plots=y
从中位数中减去最小值,从最大值中减去中位数。y expr=\thisrow{med}-\thisrow{min}
y expr=\thisrow{max}-\thisrow{med}
stack plots=y
通过仅提供所需的图或设置stack plots=false
不想堆叠的图,可以将图的堆叠应用于选定的图。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
size min max med
1 1 3 2
10 2 4 3
}{\loadedtable}
\begin{tikzpicture}
\begin{axis}[
enlarge x limits=false, axis on top,
legend entries={below median,median, above median},
reverse legend, legend pos=outer north east,
ymin=0,
]
\addplot [stack plots=y, fill=none, draw=none, forget plot] table [x=size, y=min] {\loadedtable} \closedcycle;
\addplot [stack plots=y, fill=green!40, draw opacity=0, area legend] table [x=size, y expr=\thisrow{med}-\thisrow{min}] {\loadedtable} \closedcycle;
\addplot [stack plots=false, draw=black, thick] table [x=size, y=med] {\loadedtable};
\addplot [stack plots=y, fill=red!40, draw opacity=0, area legend] table [x=size, y expr=\thisrow{max}-\thisrow{med}] {\loadedtable} \closedcycle;
%
\end{axis}
\end{tikzpicture}
\end{document}