从 fillbetween 添加填充边框的图例条目

从 fillbetween 添加填充边框的图例条目

我制作了如下所示的图表来显示因变量的值的分布与自变量的变化。

\documentclass[varwidth]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{fillbetween}
\usepackage{tikz}

\pgfplotstableread{
x min q1 med q3 max
1 0 2 4 6 8
2 2 4 5 6 8
3 1 3 5 7 9
}\data%

\begin{document}
\begin{tikzpicture}
  \begin{axis}[title=Example,
    xlabel=x,
    ylabel=y,
    ]
    \addplot[blue, dashed] table [x=x, y=min] {\data};
    \addplot[blue, dotted, name path global=q1] table [x=x, y=q1] {\data};
    \addplot[blue, solid] table [x=x, y=med] {\data};
    \addplot[blue, dotted, name path global=q3] table [x=x, y=q3] {\data};
    \addplot[blue, dashed] table [x=x, y=max] {\data};
    \addplot[blue, fill opacity=0.3] fill between[of=q1 and q3];
  \end{axis}
\end{tikzpicture}

\end{document}

上图显示了由代码生成的 PDF 图

我希望有这样一个传奇故事,

图例示例

这可能吗?怎么做?

编辑:添加我的完整解决方案

下面的解决方案得到了我想要的大部分内容,经过一些小修改,我就能完美地完成它。(嗯,下面的图片并不完美——我刚刚意识到我交换了 Q1 和 Q3。)

最终结果显示正确的图例

我将自定义图例条目的尺寸从 0.1 厘米增加到了 0.4 厘米,

\pgfplotsset{custom legend/.style={%
                /pgfplots/legend image code/.code={%
                        \path[##1] (0cm,-.4cm) rectangle (0.6cm,0.4cm);
                        \draw[dotted] (0cm,-0.4cm) -- (0.6cm,-0.4cm)
                         (0cm,0.4cm) -- (0.6cm,0.4cm);
                         \draw[blue] (0cm,0cm) -- (0.6cm,0cm);
                }}}

并将相应的图例条目设为三行,

\begin{axis}[title=Example,
  xlabel=x,
  ylabel=y,
  legend style={cells={align=left}},
  ]
  \addlegendimage{blue,dashed}
  \addlegendentry[font=\sffamily]{Maximum}
  \addlegendimage{custom legend,draw=none,fill=blue,fill opacity=0.3}
  \addlegendentry[xshift=-2mm,font=\sffamily]{Q1 \\ Median \\ Q3}
  \addlegendimage{blue,dashed}
  \addlegendentry[xshift=-0.2mm,font=\sffamily]{Minimum}
...

答案1

这是一份提案。我查阅了area legend并将pgfplots.code.tex其作为 的基础custom legend,我认为它已经接近你想要的了,并且可以进一步定制。(我很确定我见过使用类似技巧的答案,但即使经过长时间的搜索,我也找不到它。我绝对不是说我是第一个使用这些技巧的人。)无论如何,快速定制的结果是(经过长时间的搜索而没有找到结果)

\documentclass[varwidth]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{fillbetween}
\usepackage{tikz}

\pgfplotstableread{
x min q1 med q3 max
1 0 2 4 6 8
2 2 4 5 6 8
3 1 3 5 7 9
}\data%
\pgfplotsset{custom legend/.style={%
                /pgfplots/legend image code/.code={%
                        \path[##1] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
                        \draw[dotted] (0cm,-0.1cm) -- (0.6cm,-0.1cm)
                         (0cm,0.1cm) -- (0.6cm,0.1cm);
                         \draw[blue] (0cm,0cm) -- (0.6cm,0cm);
                }}}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[title=Example,
    xlabel=x,
    ylabel=y,
    ]
    \addlegendimage{blue,dashed}
    \addlegendentry[font=\sffamily]{Maximum}
    \addlegendimage{custom legend,draw=none,fill=blue,fill opacity=0.3}
    \addlegendentry[xshift=-2mm,font=\sffamily]{Median}
    \addlegendimage{blue,dashed}
    \addlegendentry[xshift=-0.2mm,font=\sffamily]{Minimum}
    \addplot[blue, dashed] table [x=x, y=min] {\data};
    \addplot[blue, dotted, name path global=q1] table [x=x, y=q1] {\data};
    \addplot[blue, solid] table [x=x, y=med] {\data};
    \addplot[blue, dotted, name path global=q3] table [x=x, y=q3] {\data};
    \addplot[blue, dashed] table [x=x, y=max] {\data};
    \addplot[blue, fill opacity=0.3] fill between[of=q1 and q3];
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

经过一段时间的休眠后,如果需要的话,我会很乐意协助您进行进一步的定制。

相关内容