добавление узлов к сегментам линии

добавление узлов к сегментам линии

У меня есть следующий код:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[active,float]{preview}
\usetikzlibrary{calc}
\usetikzlibrary{graphs,plotmarks,arrows,automata,positioning,fit,shapes.geometric,backgrounds}
\usepackage{graphicx}
\PreviewEnvironment{tikzpicture} 
\usetikzlibrary{plotmarks}

\begin{document}
\begin{tikzpicture}[x=0.8cm,y=0.5cm]
    %axis
    \draw (0,0) -- coordinate (x axis mid) (10,0);
        \draw (0,0) -- coordinate (y axis mid) (0,12);

        %ticks
        \foreach \x in {0,...,10}
        \draw (\x,0pt) -- (\x,-3pt)     node[anchor=north] {\x};
        \foreach \y in {0,...,12}
            \draw (0pt,\y) -- (-3pt,\y)     node[anchor=east] {\y}; 

    %labels      
    \node[below=0.8cm,xshift=0.3cm,scale=1.5] at (x axis mid) {$\sum{t_i}\;\;\longrightarrow$};

    % plot first concave function
    \draw[mark=square*,green,thick,mark options={fill=green}] (0,2) -- (1,3) -- (2,4) -- (3,5) -- (4,5) -- (5,5) -- (6,5) -- (7,5) -- (8,5) -- (9,3) -- (10,1);

    \node[mark=square*,green,thick,mark options={fill=green}] at (4,5) {};

    % plot second concave function
    \draw[mark=square*,red,thick,mark options={fill=red}] (0,1) -- (1,2) -- (2,3) -- (3,4) -- (4,5) -- (5,6) -- (6,6) -- (7,5) -- (8,4) -- (9,3) -- (10,2);

    % plot third concave function
    \draw[mark=*,blue,thick,mark options={fill=blue}] (0,3) -- (1,5) -- (2,7) -- (3,9) -- (4,10) -- (5,11) -- (6,11) -- (7,10) -- (8,9) -- (9,6) -- (10,3);

    %legend 
    \begin{scope}[shift={(0.5,10)}] 
    \draw[yshift=3\baselineskip] (0,0) -- 
        plot[mark=square*, mark options={fill=red}] (0.25,0) -- (0.5,0) node[right]{$f(t)$};
    \draw[yshift=2\baselineskip] (0,0) -- 
        plot[mark=square*, mark options={fill=green}] (0.25,0) -- (0.5,0) node[right]{$g(t)$};
    \draw[yshift=\baselineskip] (0,0) -- 
        plot[mark=square*, mark options={fill=blue}] (0.25,0) -- (0.5,0) node[right]{$f(t) + g(t)$};
    \end{scope}
\end{tikzpicture}

\end{document}

представляющий собой следующую фигуру:

Цель фигуры

У меня возникли проблемы при выполнении следующих действий:

  1. Показать числа по обеим осям xy с шагом 2

  2. По какой-то причине я не могу визуализировать узлы между отрезками линии.

  3. Невозможно добавить прямоугольную область вокруг легенды.

решение1

Как упоминалось в комментариях и в ответе Хариша, использование pgfplotsпозволяет вам задать стиль один раз и повторно использовать его в документе, а не изобретать велосипед для каждого графика.

Я создал cycle listфункцию mycycle, которую можно использовать в любом графике (с возможностью cycle list name=mycycleциклического переключения между стилями графика).

Остальная часть стилизации выполняется в параметрах окружения axis, но ее легко упаковать в стиль TikZ для повторного использования в любых других сюжетах.

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\pgfplotscreateplotcyclelist{mycycle}{%
  green!70!black,every mark/.append style={fill=green!80},mark=diamond*\\%
    red!70!black,every mark/.append style={fill=  red!80},mark=square*\\%
   blue!70!black,every mark/.append style={fill= blue!80},mark=*\\%
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
  axis lines=left,
  ymin=0,ymax=13.75,
  tick align=inside,
  axis line style={-},
  cycle list name=mycycle,
  legend pos=north west,
  legend cell align=left,
  legend style={
    outer sep=-0.2em,
    inner sep=0.2em,
    node font=\small,
  },
  xlabel={$\sum{t_i}\;\;\longrightarrow$},
]
  \addplot coordinates {
    (0,2) (1,3) (2,4) (3,5) (4,5) (5,5) (6,5) (7,5) (8,5) (9,3) (10,1)
  };
  \addlegendentry{$f(t)$};
  \addplot coordinates {
    (0,1) (1,2) (2,3) (3,4) (4,5) (5,6) (6,6) (7,5) (8,4) (9,3) (10,2)
  };
  \addlegendentry{$g(t)$};
  \addplot coordinates {
    (0,3) (1,5) (2,7) (3,9) (4,10) (5,11) (6,11) (7,10) (8,9) (9,6) (10,3)
  };
  \addlegendentry{$f(t)+g(t)$};
\end{axis}
\end{tikzpicture}
\end{document}

введите описание изображения здесь

решение2

Почему бы не использовать pgfplotsдля таких задач? В любом случае, чтобы нарисовать рамку вокруг легенды, вы можете использовать fitбиблиотеку. Синтаксис plotотличается. Чтобы получить отметки графика, вы должны использовать координаты с правильным синтаксисом. А для получения меток делений в кратных измените 2цикл foreach на {0,2,...,12}.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\usetikzlibrary{graphs,plotmarks,arrows,automata,positioning,fit,shapes.geometric,backgrounds}
\usetikzlibrary{plotmarks,fit}

\begin{document}
\begin{tikzpicture}[x=0.8cm,y=0.5cm]
    %axis
    \draw (0,0) -- coordinate (x axis mid) (10,0);
        \draw (0,0) -- coordinate (y axis mid) (0,12);

        %ticks
        \foreach \x in {0,2,...,10}
        \draw (\x,0pt) -- (\x,-3pt)     node[anchor=north] {\x};
        \foreach \y in {0,2,...,12}
            \draw (0pt,\y) -- (-3pt,\y)     node[anchor=east] {\y};

    %labels
    \node[below=0.8cm,xshift=0.3cm,scale=1.5] at (x axis mid) {$\sum{t_i}\;\;\longrightarrow$};

    % plot first concave function
    \draw[green,thick,] plot[mark=square*,mark options={fill=green}] coordinates{(0,2)  (1,3)  (2,4)  (3,5) (4,5)  (5,5)  (6,5)  (7,5)  (8,5) (9,3)  (10,1)};

    \node[mark=square*,green,thick,mark options={fill=green}] at (4,5) {};

    % plot second concave function
    \draw[red,thick] plot[mark=square*,mark options={fill=red}] coordinates {(0,1)  (1,2)  (2,3) (3,4)  (4,5)  (5,6)  (6,6)  (7,5)  (8,4)  (9,3)  (10,2)};

    % plot third concave function
    \draw[blue,thick] plot [mark=*,mark options={fill=blue}] coordinates{(0,3)  (1,5)  (2,7)  (3,9)  (4,10)  (5,11)  (6,11)  (7,10)  (8,9)  (9,6)  (10,3)};

    %legend
    \begin{scope}[shift={(0.5,10)}]
    \draw[yshift=3\baselineskip] (0,0) node(a){} --
        plot[mark=square*, mark options={fill=red}] (0.25,0) -- (0.5,0) node[right]{$f(t)$};
    \draw[yshift=2\baselineskip] (0,0) --
        plot[mark=square*, mark options={fill=green}] (0.25,0) -- (0.5,0) node[right]{$g(t)$};
    \draw[yshift=\baselineskip] (0,0) --
        plot[mark=square*, mark options={fill=blue}] (0.25,0) -- (0.5,0) node[right](fg){$f(t) + g(t)$};
    \node[draw,fit=(a) (fg)] {};
    \end{scope}
\end{tikzpicture}

\end{document}

введите описание изображения здесь

Кстати, вам не нужно previewявно упаковывать standaloneкласс.

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