![如何在不使用 pgfplots 的情况下添加图例?](https://linux22.com/image/407377/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E4%BD%BF%E7%94%A8%20pgfplots%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E6%B7%BB%E5%8A%A0%E5%9B%BE%E4%BE%8B%EF%BC%9F.png)
我正在使用 TikZ 重新创建几个图形作为练习(因为我很无聊)。我绘制了这张图,但我需要为虚线(绿色)和正常虚线(黑色)添加图例。如何在不使用 PGF 图的情况下做到这一点?该限制仅用于个人挑战,因为在这个网站的不同答案中我发现每个人都使用它。我刚刚开始使用 TikZ 库,我完全是个菜鸟。谢谢。
这是我的代码:
\begin{figure}[h!]
\centering
\begin{tikzpicture}
\draw [<->] (0,4) -- (0,0) -- (4,0);
\draw [dotted, ultra thick, color=darkpastelgreen] (0,3) -- (3,0);
\draw [-] (0,3) -- (3,0);
\node [left] at (0,3) {$100$};
\node [below] at (3,0) {$100$};
\node [below left] at (0,0) {0};
\node [below] at (4,0) {$S_{B}$};
\node [left] at (0,4) {$S_{A}$};
\draw [dashed, color=lightgray] (0,3) -- (3,3) -- (3,0);
\draw[decoration={brace,raise=5pt},decorate]
(0,2.9) -- node[above right=6pt] {Agreement Zone} (2.9,0);
\end{tikzpicture}
\end{figure}
最后一个问题:我的代码是最优的吗?或者我可以用更优化的方式来实现它?我非常感谢所有帮助我改进图表的人。
答案1
欢迎!添加图例相当容易。你只需要一个matrix
和一个pic
,
\path (current bounding box.north east)
node[matrix,anchor=north east,draw,nodes={anchor=center},inner sep=2pt] {
\pic{sample=black}; & \node{$BR_A$}; \\
\pic{sample={Dotted,ultra thick,color=darkpastelgreen}}; & \node{$BR_B$}; \\
};
这里,pic
示例被定义为展示您在图片中使用的绘图样式。您可以使其更加自动化,但这仅仅意味着切换到pgfplots
,而您似乎并不想要。您可以通过多种方式改进您的代码,但这需要您投入更多精力。一种相当明显的改进方法是使用漂亮的虚线这里。无论如何,这里有一个更符合人体工程学的代码,更接近您的目标图片。它避免了坐标的重复(在某种程度上)并使用了-|
类似的技巧。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\definecolor{darkpastelgreen}{RGB}{105,186,72}
\begin{document}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[>=stealth,scale=pi/2,
pics/sample/.style={code={\draw[#1] (0,0) --(0.6,0) ;}},
Dotted/.style={% https://tex.stackexchange.com/a/52856/194703
dash pattern=on 0.1\pgflinewidth off #1\pgflinewidth,line cap=round,
shorten >=#1\pgflinewidth/2,shorten <=#1\pgflinewidth/2},
Dotted/.default=3]
\draw [<->] (0,4) node[left] {$S_{A}$} -- (0,0) node[below left] {$0$}
-- (4,0) node [below] {$S_{B}$};
\draw [-] (0,3)node[left] {$100$} -- (3,0) node[below] {$100$};
\draw [Dotted,ultra thick, color=darkpastelgreen] (0,3)-- (3,0);
\draw [dashed, color=lightgray] (0,3) -| (3,0);
\draw[decoration={brace,raise=5pt},decorate,thick]
(0,2.9) -- node[above right=2ex,xshift=-2ex,align=left] {Agreement\\ Zone} (2.9,0);
\path (current bounding box.north east)
node[matrix,anchor=north east,draw,nodes={anchor=center},inner sep=2pt] {
\pic{sample=black}; & \node{$BR_A$}; \\
\pic{sample={Dotted,ultra thick,color=darkpastelgreen}}; & \node{$BR_B$}; \\
};
\end{tikzpicture}
\end{figure}
\end{document}
答案2
这是我的建议。 我不会使用 ,而是pgfplots
只使用 TikZ:将pic
(名称circ
是一个彩色的小圆圈)放在 旁边path
。
另一种方式是沿路径使用装饰。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[>=latex,
circ/.pic={\fill[green!50!black] (0,0) circle(1.5pt);}]
\draw (0,3)--(3,0);
\draw[<->] (0,4)--(0,0)--(5,0);
\draw[dashed,lightgray] (0,3)-|(3,0);
\draw[decoration={brace,raise=3pt},decorate]
(0,3)--(3,0);
\foreach \i in {0,.05,...,1.05}
\path (0,3)--(3,0) pic[pos=\i]{circ};
\path
(0,3) node[left]{$100$}
(3,0) node[below]{$100$}
(0,0) node[below left]{0}
(5,0) node[below]{$S_{B}$}
(0,4) node[left]{$S_{A}$}
(2.2,2.2) node[align=left,scale=.8] {Agreement\\Zone};
% for legend
\begin{scope}[local bounding box=L,shift={(4.5,3.5)}]
\path (0,0) node (A) {$BR_A$}
(-90:.4) node (B) {$BR_B$};
\draw (A.west)--+(180:.6);
\foreach \i in {0,.3,...,1}
\path (B.west)--+(180:.6) pic[pos=\i]{circ};
\end{scope}
\draw ([xshift=-2mm]L.south west) rectangle (L.north east);
\end{tikzpicture}
\end{figure}
\end{document}