我正在尝试自定义该图表的图例。第一的首先,我希望图例宽度等于 x 轴宽度。目前,我通过以下方式设置图例宽度
/tikz/every even column/.append style={column sep=1.0cm}
我可以手动调整这个值,使得长度等于 x 轴宽度,但我想有一种更优雅的方法来设置图例的宽度。
第二,我不太喜欢图例中的小彩色矩形。我只希望每个条目前面有一个矩形,而不是两个。这个矩形不需要有边框,应该与文本垂直居中。靠近文本的矩形的对齐似乎没问题,但最左边的矩形则不行。
更新:感谢 Christian Feuersänger 的评论,可以通过以下方式更改矩形
legend image code/.code={%
\draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
或者 Gonzalo Medina 提出的建议
legend image code/.code={%
\draw[#1, draw=none, /tikz/.cd, bar width=3pt, yshift=-0.2em, bar shift=0pt] %
plot coordinates {(2*\pgfplotbarwidth,0.6em)};
第三,我希望图例条目从文本“图例:”旁边开始。
我真的不知道在满足这些要求的情况下使用图例是否仍然有意义,或者是否最好通过after end axis/.code
和手动添加所有内容\ref{label}
。
图形
平均能量损失
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
height=6cm,
title={Some plot},
width=12cm,
axis on top,
y axis line style={opacity=0},
axis x line*=bottom,
tick align=inside,
tick style={draw=none},
xtick=data,
ymajorgrids,
major grid style={draw=white},
xtick={1,2,3,4},
legend style={
at={(0.0,-0.15)},
anchor=north west,
legend columns=-1,
/tikz/every even column/.append style={column sep=1.0cm}
},
]
\addlegendimage{empty legend}
\addlegendentry{\textbf{Legend:}}
\addplot coordinates {
(1, 0.2064)
(2, 0.3961)
(3, 0.5961)
(4, 0.7961)}; \addlegendentry[text width=45pt, text depth=]{legend a}
\addplot coordinates {
(1, 0.3064)
(2, 0.4961)
(3, 0.6961)
(4, 0.8961)}; \addlegendentry[text width=65pt, text depth=]{lengend b}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
关于你的第一个问题:
我如何配置图例,使其占据规定的空间量(例如图形的宽度)?
据我所知,这不可能通过 PGF 实现\matrix
——而这些图例就是 PGF \matrix
。正如您在问题中所考虑的那样,剩下的选择是针对\label
每个图,并使用每个图手动生成图例\ref
,例如使用
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\def\INNERSEP{2pt}
\def\WIDTH{12cm}
\begin{axis}[
ybar,
height=6cm,
title={Some plot},
width=\WIDTH,
scale only axis, % <------------
axis on top,
y axis line style={opacity=0},
axis x line*=bottom,
tick align=inside,
tick style={draw=none},
xtick=data,
ymajorgrids,
major grid style={draw=white},
xtick={1,2,3,4},
legend image code/.code={%
\draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
},
extra description/.code={
\node[
draw,
text depth=0pt,
at={(0.0,-0.15)},
anchor=north west,
text width=\WIDTH-2*\INNERSEP,
inner sep=\INNERSEP,
outer sep=0pt,
] {
% Some TeX/LaTeX construct which constructs
% the legend:
\hbox to \linewidth{%
\textbf{Legend:}
\ref{A} Legend a \hfill \ref{B} Legend b \hfill
}%
};
},
]
\addplot coordinates {
(1, 0.2064)
(2, 0.3961)
(3, 0.5961)
(4, 0.7961)};
\label{A}
\addplot coordinates {
(1, 0.3064)
(2, 0.4961)
(3, 0.6961)
(4, 0.8961)};
\label{B}
\end{axis}
\end{tikzpicture}
\end{document}
关于你的第二个问题:
我如何重新配置每个图的小图像的外观?
正如一些评论指出的那样,图例中显示的小图像可以使用 重新配置legend image code
。小条的合适替代品可能是使用一些矩形(如您的编辑中所示)。
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
height=6cm,
title={Some plot},
width=12cm,
axis on top,
y axis line style={opacity=0},
axis x line*=bottom,
tick align=inside,
tick style={draw=none},
xtick=data,
ymajorgrids,
major grid style={draw=white},
xtick={1,2,3,4},
legend image code/.code={%
\draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
},
legend style={
draw=none, % ?
text depth=0pt,
at={(0.0,-0.15)},
anchor=north west,
legend columns=-1,
% default spacing:
column sep=1cm,
% The text "Legend:"
/tikz/column 2/.style={column sep=0pt,font=\bfseries},
%
% the space between legend image and text:
/tikz/every odd column/.append style={column sep=0cm},
},
]
\addlegendimage{empty legend}
\addlegendentry{\textbf{Legend:}}
\addplot coordinates {
(1, 0.2064)
(2, 0.3961)
(3, 0.5961)
(4, 0.7961)}; \addlegendentry{legend a}
\addplot coordinates {
(1, 0.3064)
(2, 0.4961)
(3, 0.6961)
(4, 0.8961)}; \addlegendentry{lengend b}
\end{axis}
\end{tikzpicture}
\end{document}
关于第三个问题:
我如何重新配置图例,使其从文本“图例:”旁边开始?
如果您配置了,则可以分发column sep
这样的东西,使其不适用于您的第一个人造图例条目/tikz/column 2/.style
。我在上面的例子中就是这么做的。
draw=none
您会注意到,由于缺乏对您的第一个问题的支持,我还添加了内容。