我正在尝试绘制两个图形,并填充它们之间的区域。这很好,除了 \closedcycle 不是垂直向下,而是以某个(任意?)斜率(用红色圈出)向下: 这是我的 MWE:
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread[col sep=semicolon] {data.csv}\data
\begin{axis}[
xmin=0.2]
\addplot[gray,smooth,fill=black!10!white]
table[x=xvalues,y=upper]{\data} \closedcycle;
\addplot[gray,smooth,fill=white]
table[x=xvalues,y=lower]{\data} \closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}
我的 data.csv 如下所示:
xvalues;lower;upper
0.15;949.59;1069.76
0.21;1290.74;1457.88
0.27;1617.32;1822.28
0.33;1928.45;2167.26
0.39;2237.91;2486.17
0.45;2526.9;2776.77
0.51;2750.88;3032.38
0.57;2875.84;3249.56
0.63;2935.11;3326.71
0.69;2854.73;3237.55
0.75;2595.52;3087.41
0.81;2256.67;2756.42
0.87;1681.25;2169.95
0.93;1636.97;1974.47
0.99;1464.91;1773.17
1.05;1307.58;1590.35
1.11;1188.51;1454.49
1.17;1078.54;1317.64
1.23;981.88;1216.65
1.29;902.7;1120.32
1.35;834.92;1015.32
1.41;763.63;924.14
1.47;694.77;843.91
编辑:我目前的解决方法是将虚数值设为 1.6,并设置 xmax=1.5,这样斜率就会超出绘图区域。不过,这可能不是正确的做法,所以我仍然很感兴趣。或者我的填充方法总体上是错误的?
答案1
我建议你使用堆叠图。这样你就可以得到一个平滑的图,而不需要重新排列数据。
为此,您可以先将下面的图绘制为不可见的图,方法是设置stack plots=y
选项axis
,然后使用类似
\addplot[draw=none,smooth,fill=none]
table[x=xvalues,y=lower]{\data};
然后将上限值和下限值的差值堆叠在顶部:
\addplot[black,smooth,fill=gray!25]
table[x=xvalues,y expr=\thisrow{upper}-\thisrow{lower}]{\data} \closedcycle;
这将给你
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread[col sep=semicolon] {
xvalues;lower;upper
0.15;949.59;1069.76
0.21;1290.74;1457.88
0.27;1617.32;1822.28
0.33;1928.45;2167.26
0.39;2237.91;2486.17
0.45;2526.9;2776.77
0.51;2750.88;3032.38
0.57;2875.84;3249.56
0.63;2935.11;3326.71
0.69;2854.73;3237.55
0.75;2595.52;3087.41
0.81;2256.67;2756.42
0.87;1681.25;2169.95
0.93;1636.97;1974.47
0.99;1464.91;1773.17
1.05;1307.58;1590.35
1.11;1188.51;1454.49
1.17;1078.54;1317.64
1.23;981.88;1216.65
1.29;902.7;1120.32
1.35;834.92;1015.32
1.41;763.63;924.14
1.47;694.77;843.91
}\data
\begin{axis}[
xmin=0,
stack plots=y
]
\addplot[draw=none,smooth,fill=none]
table[x=xvalues,y=lower]{\data};
\addplot[black,smooth,fill=gray!25]
table[x=xvalues,y expr=\thisrow{upper}-\thisrow{lower}]{\data} \closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}
答案2
虽然不是专家,但我有一个解决方案。优点:没有有趣的斜坡,缺点:无法平滑,不是真正的封闭情节
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{datalow.dat}
# xvalues lower
0.15 949.59
0.21 1290.74
0.27 1617.32
0.33 1928.45
0.39 2237.91
0.45 2526.9
0.51 2750.88
0.57 2875.84
0.63 2935.11
0.69 2854.73
0.75 2595.52
0.81 2256.67
0.87 1681.25
0.93 1636.97
0.99 1464.91
1.05 1307.58
1.11 1188.51
1.17 1078.54
1.23 981.88
1.29 902.7
1.35 834.92
1.41 763.63
1.47 694.77
\end{filecontents}
\begin{filecontents}{dataup.dat}
# xvalues upper
0.15 1069.76
0.21 1457.88
0.27 1822.28
0.33 2167.26
0.39 2486.17
0.45 2776.77
0.51 3032.38
0.57 3249.56
0.63 3326.71
0.69 3237.55
0.75 3087.41
0.81 2756.42
0.87 2169.95
0.93 1974.47
0.99 1773.17
1.05 1590.35
1.11 1454.49
1.17 1317.64
1.23 1216.65
1.29 1120.32
1.35 1015.32
1.41 924.14
1.47 843.91
\end{filecontents}
\usepackage{pgfplots,pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread{datalow.dat}\datalow
\pgfplotstableread{dataup.dat}\dataup
\pgfplotstablesort[sort cmp={float >}]{\dataupsorted}{\dataup}
\pgfplotstablevertcat{\filledcurve}{\datalow}
\pgfplotstablevertcat{\filledcurve}{\dataupsorted}
\begin{axis}
%Plot the dataset
\addplot[mark=none,black] table {\dataup};
\addplot[mark=none,black] table {\datalow};
%Plot the filles curve
\addplot[fill=gray!20,draw=none,forget plot] table {\filledcurve};
\end{axis}
\end{tikzpicture}
\end{document}