
Я хочу создать диаграмму обратной связи, похожую на
Мне удалось получить следующее:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{arrows,calc,positioning}
%%%<
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%%%>
\begin{document}
\pagestyle{empty}
\tikzset{
block/.style = {draw, rectangle,
minimum height=1cm,
minimum width=2cm},
input/.style = {coordinate,node distance=1cm},
output/.style = {coordinate,node distance=4cm},
arrow/.style={draw, -latex,node distance=2cm},
pinstyle/.style = {pin edge={latex-, black,node distance=2cm}},
sum/.style = {draw, circle, node distance=1cm},
}
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [input, name=input] {};
\node [block, below=of input] (nn) {Neural Network};
\node [block, below=of nn] (error) {Cost of the error};
\node [input, right=of error, name=out] {};
\node [block, below=of error] (opt) {Optimiser};
\draw [draw,->] (input) -- node {Input} (nn);
\draw [draw,->] (out) -- node[xshift=1.75cm, yshift=0.3cm] {Actual output} (error) ;
\draw [->] (nn) -- node {Calculated output} (error);
\draw [->] (error) -- (opt);
\end{tikzpicture}
\end{document}
Результат:
Но как вы видите, левая часть все еще отсутствует, и я не смог создать стрелку с текстом таким образом. Как бы мне это сделать?
решение1
Кажется, вы новичок в TikZ. Рекомендую использовать простой способ рисования. Простую фигуру следует рисовать простым способом.
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\tikzset{block/.style={
text=white,
fill=red!70!black,
minimum height=1cm,
minimum width=3cm}}
\begin{tikzpicture}[thick,red!70!black]
\path
(0,0) node[block] (N) {Neural Network}
++(-90:2.5) node[block] (C) {Cost of the error}
+(-90:2) node[block] (O) {Optimizer};
\draw[<-] (N.north)--+(90:.5) node[above,black] {Input};
\draw[->] (N)--(C) node[midway,right,black] {Calculated output};
\draw[<-] (C.east)--+(0:.5) node[right,black] {Actual output};
\draw[->] (C)--(O);
\draw[<-] (N)--++(180:3) coordinate (A)--++(-90:5.5) coordinate (B)-|(O);
\path (A)--(B) node[midway,left,align=left,black] {New weights\\and constants};
\end{tikzpicture}
\end{document}
Обновление 1.Вы можете изменить стрелки, указав >=stealth
в качестве опции tikzpicture. Стрелки в ответе Зарко, похоже, выглядят наиболее хорошо ^^
\usetikzlibrary{arrows.meta}
\begin{tikzpicture}[thick,red!70!black,>={Straight Barb[angle=60:3pt 2]}]
Обновление 2.Если кто-то не помнит опции в библиотеке arrows.meta
, то пользовательская стрелка тоже удобна. Здесь я спроектировал стрелку с именеммем, с цветом циан, используя pic
. Я вижу, что этот вариант [sloped, pos]
очень хорош для этой цели.
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\tikzset{
block/.style={text=white,
fill=brown,
minimum height=1cm,
minimum width=3cm},
meme/.pic={% my favourite arrow
\draw[teal] (150:6pt)--(0,0)--(-150:6pt);}
}
\begin{tikzpicture}[thick,brown]
\path
(0,0) node[block] (N) {Neural Network}
++(-90:2.5) node[block] (C) {Cost of the error}
+(-90:2) node[block] (O) {Optimizer};
\draw ([yshift=.5mm]N.north)--+(90:.5) pic[pos=0,sloped,xscale=-1]{meme}
node[above,black] {Input};
\draw (N)--(C) pic[pos=1,sloped]{meme}
node[midway,right,black]{Calculated output};
\draw ([xshift=.5mm]C.east)--+(0:.5) pic[pos=0,sloped,xscale=-1]{meme}
node[right,black]{Actual output};
\draw (C)--(O) pic[pos=1,sloped]{meme};
\draw (N)--++(180:3) coordinate (A) pic[pos=0,sloped]{meme}
--++(-90:5.5) coordinate (B)-|(O);
\path (A)--(B) node[midway,left,align=left,black] {New weights\\and constants};
\end{tikzpicture}
\end{document}
решение2
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning}
%%%<
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%%%>
\begin{document}
\pagestyle{empty}
\tikzset{
block/.style = {draw, rectangle,
minimum height=1cm,
minimum width=2cm},
input/.style = {coordinate,node distance=1cm},
output/.style = {coordinate,node distance=4cm},
line/.style={draw, -latex'}}
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [input, name=input] {};
\node [block, below=of input] (nn) {Neural Network};
\node [block, below=of nn] (error) {Cost of the error};
\node [input, right=of error, name=out] {};
\node [block, below=of error] (opt) {Optimiser};
\begin{scope}[line]
\draw (input) -- node {Input} (nn);
\draw (out) -- node[xshift=1.75cm, yshift=0.3cm] {Actual output} (error) ;
\draw (nn) -- node {Calculated output} (error);
\draw (error) -- (opt);
\draw (opt.south) |- ++ (-6em,-1em) |- (nn)
node[pos=0.25,left,align=left]{New weights\\ and constants};
\end{scope}
\end{tikzpicture}
\end{document}
решение3
Я изменил ваш код настолько мало, насколько это было возможно, следующим образом:
1) Чтобы получить тот же цвет, что в вашем примере, я использовал бесплатный ресурс Стефана Тростаинструмент пипетка: А с помощью пакета xcolor я определяю тот же цвет:
\usepackage{xcolor}
\definecolor{myred}{RGB}{149, 55, 53}
2) блок имеет минимальную ширину3 cm
block/.style = {draw, rectangle,fill=myred,text=white,
minimum height=1cm,
minimum width=3cm}
3) чтобы нарисовать стрелку к блоку (error)
, я сначала размещаю node
справа от него a, а затем стрелку с edge
синтаксисом
\node[right=of error]{Actual output}edge[->](error);
4) для стрелки, которая идет по кругу, я размещаю вспомогательныйnode (aux)
% auxiliary node (aux)
\node [coordinate,below left=4mm and 10 mm of opt](aux){};
и использовать синтаксис |-
и -|
для того, чтобы рисовать квадратные линии. Я размещаю текст вposition 0.25
\draw [->](opt)|-(aux)|-node[pos=.25,align=left]{New weigths \\and constant}(nn);
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{arrows,calc,positioning}
%%%<
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%%%>
\usepackage{xcolor}
\definecolor{myred}{RGB}{149, 55, 53}
\begin{document}
\pagestyle{empty}
\tikzset{
block/.style = {draw, rectangle,fill=red,text=white,
minimum height=1cm,
minimum width=3cm},
input/.style = {coordinate,node distance=1cm},
output/.style = {coordinate,node distance=4cm},
arrow/.style={draw, -latex,node distance=2cm},
pinstyle/.style = {pin edge={latex-, black,node distance=2cm}},
sum/.style = {draw, circle, node distance=1cm},
}
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [input, name=input] {};
\node [block, below=of input] (nn) {Neural Network};
\node [block, below=of nn] (error) {Cost of the error};
\node[right=of error]{Actual output}edge[->](error);
%\node [ right=of error, name=out] {};
\node [block, below=of error] (opt) {Optimiser};
% auxiliary node (aux)
\node [coordinate,below left=4mm and 10 mm of opt](aux){};
\draw [draw,->] (input) -- node {Input} (nn);
%\draw [draw,->] (out) -- node[xshift=1.75cm, yshift=0.3cm] {Actual output} (error) ;
\draw [->] (nn) -- node {Calculated output} (error);
\draw [->] (error) -- (opt);
\draw [->](opt)|-(aux)|-node[pos=.25,align=left]{New weigths \\and constant}(nn);
\end{tikzpicture}
\end{document}
решение4
Еще один пример:
\documentclass{article}
%\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
calc, chains,
positioning,
quotes}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
\begin{document}
\tikzset{
node distance = 8mm and 4mm,
start chain = going below,
block/.style = {fill=orange!70!black, text=white,
minimum height=8mm, minimum width=32mm,
on chain},
arrow/.style = {draw=orange!70!black, -{Straight Barb[angle=60:3pt 2]}, thick},
every pin edge/.style = {arrow}
}
\begin{tikzpicture}
\node (in) {Input};
\node [block, below=of in] (nn) {Neural Network};
\node [block,
pin=right:Actual output
] (error) {Cost of the error};
\node [block] (opt) {Optimiser};
\coordinate[below=4mm of opt] (out);
%
\draw[arrow] (in) edge (nn)
(nn) edge["Calculated output"] (error)
(error) edge (opt)
(opt.south) -- (out) -|
([xshift=-5mm] nn.west) node[pos=0.75,left,align=left] {New Weights\\ and constants}
-- (nn);
\end{tikzpicture}
\end{document}