Как добавить легенду без использования pgfplots?

Как добавить легенду без использования pgfplots?

Я использую TikZ для воссоздания нескольких графиков в качестве практики (и потому что мне скучно). Я нарисовал этот график, но мне нужно добавить легенду для пунктирной линии (зеленой) и обычной (черной). Как я могу это сделать без использования PGF Plots? Это ограничение только для личного испытания, потому что в разных ответах здесь на этом сайте я обнаружил, что все используют это. Я только начинаю использовать библиотеку 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}

Связанный контент