因此,我需要将图例放置在groupplot
具有 2 列和 2 行的图例之外。我想将其置于上方或下方的中心。
我在 tex@stackexchange 上读到了很多类似的问题,但它们似乎都使用标签来引用不同的曲线或整个图例,例如 这,这或者这(以及许多其他人)。
但是,我需要将我的图表外部化,因为我甚至不想知道如果我向 tikz 图表提供我计划提交的期刊的参考资料,我会经历多少麻烦。同样,tex@stackexchange 提供了一些巧妙的解决方案,例如这或者这,但我花了很大力气才让我的代码完美地适应这些解决方案。
因此,我想知道是否有更快的方法来解决这个问题(将我的图例置于组图外部的顶部)没有标签和引用的使用。我知道图例有一个定位选项,例如legend style={at={(0,0)}}
,所以我想知道是否可以放置一些坐标并根据这些坐标进行一些智能计算(可能不是那么智能)来定位我的图例。
快速 MWE;假设所有图都具有相同的一组曲线,我将使用相同的图例引用这些曲线(我将它们留在前 2 个图中以避免包含太多代码)。我可以使用和中的信息将c1
图例c2
精确地放置在我的组图的顶部中心,同时legend
在第 3 个图中调用命令吗?
\documentclass{article}
\usepackage[width=18cm]{geometry}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usetikzlibrary{pgfplots.groupplots}
\usetikzlibrary{plotmarks}
\usetikzlibrary{calc}
\usepgfplotslibrary{external}
\newcommand{\fwidth}{\textwidth}
\newcommand{\fheight}{3cm}
\begin{document}
\begin{tikzpicture}
%/*
\pgfplotsset{
scaled y ticks = false,
width=\fwidth*0.35,
height=\fheight,
axis on top,
xticklabel style={text width=2em,align=center},
xticklabels={\empty},
xmin=-5,xmax=5,
ymin=-5,ymax=5,
xminorticks=true,
yminorticks=true,
ylabel shift={-1.5em},
ylabel style={align=center}
}
%
\begin{groupplot}[
group style={
group size=2 by 4,
vertical sep=25pt,
horizontal sep=35pt
},
]
% -------------------------------------------------------------------------------------------------------------------
% Plot [1, 1]
%-----------
\nextgroupplot[
xticklabels={\empty},
ylabel={ylabel 1},
title={subtitle 1},
]
% (Relative) Coordinate at top of the first plot
\coordinate (c1) at (rel axis cs:0,1);
%-----------
% Plot [1, 2]
%-----------
\nextgroupplot[
xticklabels={\empty},
title={subtitle 2},
ylabel={}
]
% (Relative) Coordinate at top of the second plot
\coordinate (c2) at (rel axis cs:0,1);
%-----------
% Plot [2, 1]
%-----------
\nextgroupplot[
yshift=10pt,
xlabel={xlabel 1},
ylabel={ylabel 2},
legend style={at={($(0,0)+(1cm,1cm)$)},legend columns=4,fill=none,draw=black,anchor=center,align=center},
]
\addplot[color=red,mark=o]{x};
\addplot[color=blue,dashed]{-x};
\addplot[color=green]{-0.5*x^3};
\addlegendentry{first};
\addlegendentry{second};
\addlegendentry{third};
%-----------
% Plot [2, 2]
%-----------
\nextgroupplot[
yshift=10pt,
xlabel={xlabel 2},
]
\end{groupplot}
\end{tikzpicture}%
\end{document}
答案1
这对我来说是有效的,但我不确定 externalize 是否有效。无论如何,我假设它\pgfplotslegendfromname
不使用 aux 文件。
\documentclass{article}
\usepackage[width=18cm]{geometry}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usetikzlibrary{pgfplots.groupplots}
\usetikzlibrary{plotmarks}
\usetikzlibrary{calc}
\usepgfplotslibrary{external}
\newcommand{\fwidth}{\textwidth}
\newcommand{\fheight}{3cm}
\begin{document}
\begin{tikzpicture}
%/*
\pgfplotsset{
scaled y ticks = false,
width=\fwidth*0.35,
height=\fheight,
axis on top,
xticklabel style={text width=2em,align=center},
xticklabels={\empty},
xmin=-5,xmax=5,
ymin=-5,ymax=5,
xminorticks=true,
yminorticks=true,
ylabel shift={-1.5em},
ylabel style={align=center}
}
%
\begin{groupplot}[
group style={
group size=2 by 4,
vertical sep=25pt,
horizontal sep=35pt
},
]
% -------------------------------------------------------------------------------------------------------------------
% Plot [1, 1]
%-----------
\nextgroupplot[
xticklabels={\empty},
ylabel={ylabel 1},
title={subtitle 1},
]
% (Relative) Coordinate at top of the first plot
\coordinate (c1) at (rel axis cs:0,1);
%-----------
% Plot [1, 2]
%-----------
\nextgroupplot[
xticklabels={\empty},
title={subtitle 2},
ylabel={}
]
% (Relative) Coordinate at top of the second plot
\coordinate (c2) at (rel axis cs:1,1);% I moved this to the upper right corner
%-----------
% Plot [2, 1]
%-----------
\nextgroupplot[
yshift=10pt,
xlabel={xlabel 1},
ylabel={ylabel 2},
legend style={at={($(0,0)+(1cm,1cm)$)},legend columns=4,fill=none,draw=black,anchor=center,align=center},
legend to name=fred
]
\addplot[color=red,mark=o]{x};
\addplot[color=blue,dashed]{-x};
\addplot[color=green]{-0.5*x^3};
\addlegendentry{first};
\addlegendentry{second};
\addlegendentry{third};
%-----------
% Plot [2, 2]
%-----------
\nextgroupplot[
yshift=10pt,
xlabel={xlabel 2},
]
\end{groupplot}
\coordinate (c3) at ($(c1)!.5!(c2)$);
\node[below] at (c3 |- current bounding box.south)
{\pgfplotslegendfromname{fred}};
\end{tikzpicture}%
\end{document}