
Я пишу документ, который требует очень мало реальных графиков, и я доволен эстетикой tikz. Однако у меня возникли проблемы с поиском способа сделать простую легенду на tikz. Я знаю, что есть способ с библиотекой визуализации данных, но он кажется слишком запутанным для простых графиков. Некоторые люди предлагали использовать матрицы, что оказалось почти тем, что я хотел, например:
\documentclass[11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[->] (-1,0) -- (8,0) node[right]{$x$};
\draw[->] (0,-2) -- (0,2) node[above]{$y$};
\draw[green,samples=100,domain=-1:8] plot(\x,{sin(deg(\x))});
\draw[red,samples=100,domain=-1:8] plot(\x,{cos(deg(\x))});
\draw[blue] (0,0)--(pi/2,1)--(3*pi/2,-1)--(5*pi/2,1);
\matrix [draw, above left] at (8,-2) {
\node[green,font=\tiny] {$\sin x$}; \\
\node[red,font=\tiny] {$\cos x$}; \\
\node[blue,font=\tiny] {Lines}; \\
};
\end{tikzpicture}
\end{document}
Однако я хочу, чтобы легенда отображала стиль рисования графиков. Как мы видим в руководстве tikz:
Можно ли это сделать с помощью матриц? Я бы еще хотел, чтобы легенда была выровнена по левому краю, сейчас она справа, но не знаю, как это изменить.
решение1
Я тоже предпочитаю pfgplots, но для полноты картины вот метод, использующий pic
s.
\documentclass[11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[pics/legend entry/.style={code={%
\draw[pic actions]
(-0.5,0.25) sin (-0.25,0.4) cos (0,0.25) sin (0.25,0.1) cos (0.5,0.25);}}]
\draw[->] (-1,0) -- (8,0) node[right]{$x$};
\draw[->] (0,-2) -- (0,2) node[above]{$y$};
\draw[green!70!black,samples=100,domain=-1:8] plot(\x,{sin(deg(\x))});
\draw[red,samples=100,domain=-1:8] plot(\x,{cos(deg(\x))});
\draw[blue] (0,0)--(pi/2,1)--(3*pi/2,-1)--(5*pi/2,1);
\matrix [draw, above left] at (8,-2) {
\pic[green!70!black]{legend entry}; & \node[green!70!black,font=\tiny] {$\sin x$}; \\
\pic[red]{legend entry}; & \node[red,font=\tiny] {$\cos x$}; \\
\pic[blue]{legend entry}; & \node[blue,font=\tiny] {Lines}; \\
};
\end{tikzpicture}
\end{document}
Для выравнивания текстовых узлов можно использоватьэти трюки.
\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage{eqparbox}
\begin{document}
\newbox\eqnodebox
\tikzset{lequal size/.style={execute at begin
node={\setbox\eqnodebox=\hbox\bgroup},
execute at end node={\egroup\eqmakebox[#1][l]{\copy\eqnodebox}}},
lequal size/.default=A,}
\begin{tikzpicture}[pics/legend entry/.style={code={%
\draw[pic actions]
(-0.5,0.25) sin (-0.25,0.4) cos (0,0.25) sin (0.25,0.1) cos (0.5,0.25);}}]
\draw[->] (-1,0) -- (8,0) node[right]{$x$};
\draw[->] (0,-2) -- (0,2) node[above]{$y$};
\draw[green!70!black,samples=100,domain=-1:8] plot(\x,{sin(deg(\x))});
\draw[red,samples=100,domain=-1:8] plot(\x,{cos(deg(\x))});
\draw[blue] (0,0)--(pi/2,1)--(3*pi/2,-1)--(5*pi/2,1);
\matrix [draw, above left] at (8,-2) {
\pic[green!70!black]{legend entry}; & \node[lequal size,green!70!black,font=\tiny] {$\sin x$}; \\
\pic[red]{legend entry}; & \node[lequal size,red,font=\tiny] {$\cos x$}; \\
\pic[blue]{legend entry}; & \node[lequal size,blue,font=\tiny] {Lines}; \\
};
\end{tikzpicture}
\end{document}
решение2
Чтобы получить единообразный вид, я предлагаю никогда не использовать чистый TikZ для графиков, а использовать PGFPlot, созданный поверх TikZ.
\documentclass[11pt]{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
samples=100,
domain=-1:8,
xmin=-1, xmax=8,
ymin=-2, ymax=2,
axis lines=middle,
ticks=none,
xlabel={$x$},
ylabel={$y$},
legend pos=south east,
width=\textwidth,
height=0.5*\textwidth]
\addplot[green] {sin(deg(\x))};
\addplot[red] {cos(deg(\x))};
\addplot[blue] coordinates{(0,0) (pi/2,1) (3*pi/2,-1) (5*pi/2,1)};
\addlegendentry{$sin(x)$}
\addlegendentry{$cos(x)$}
\addlegendentry{Lines}
\end{axis};
\end{tikzpicture}
\end{document}