TeX - LaTeX Asked on August 18, 2021
How can I generate this nodes and edge structure using tikz in latex?
I created the following figure using tikz
, now I’d like to put some figures on the top of each node (e.g. a heart with heart-beat in one and a cheese figure on the other node)?
The reason I want to create the heart figure using tikz
is that the quality of my external image reduces because I cropped heart-rate from one image put it on the top of heart figure and resizing it constantly decreases its quality.
I also would like to put one of the characters from this package usepackage{tikzlings}
as a figure on top of the other node and it doesn’t work (for instance thing[cheese]
) or even not use this package but either another package or just create a cheese figure inside the node).
documentclass{standalone}
usepackage{tikz}
usetikzlibrary{fit,cal,positioning}
usepackage{tikzlings}
begin{document}
begin{tikzpicture}
%nodes for latent state
node[scale=0.07,circle, fill=red!40!brown!65] (P1) at (0,7) {includegraphics[]{}};
node[scale=0.07,circle, fill=red!40!brown!65] (P2) at (2.5,7) {includegraphics[]{}};
node[align=center] at (0,6.2){tinytextbf{textsc{Low}}};
node[align=center] at (2.5,6.2){tinytextbf{textsc{High}}};
%links
path[every node/.style={font=sffamilysmall}]
(P2) edge [bend right] coordinate [pos=0.2] (top) (P1)
(P1) edge [bend right] (P2)
;
path (P1) edge [loop left] node {} (P1);
path (P2) edge [loop right] node {} (P2);
%%%%%%%%%%
%%% RECTANGLES %%%
node[draw, thick, dotted, rounded corners, inner xsep=3.5em, inner ysep=1em, fit=(P1) (P2)] (box) {};
node[fill=white] at (box.south) {tinytextbf{textsc{States}}};
end{tikzpicture}
end{document}
At the moment, based on your code, I obtain the following picture:
Based on your intent to use an image clipped by a path, I propose you an alternative based on the path picture
syntax presented in section §15.6 of the pgfmanual
. This alternative gives the figure at the bottom of this answer.
documentclass[tikz]{standalone}
usetikzlibrary{fit}
usepackage{tikzlings}
tikzset{
img/.style={circle, fill=red!40!brown!65,inner sep=0pt},
}
begin{document}
begin{tikzpicture}
%nodes for latent state
% Current code
%node[img] (P1) at (0,7) {includegraphics[width=1cm]{example-image-a}};
%node[img] (P2) at (2.5,7) {includegraphics[width=1cm]{example-image-b}};
% Proposal
path[img] (0,7) circle (5mm) [path picture={node (P1) at (path picture bounding box.center) {includegraphics[width=1cm]{example-image-a}};}] ;
path[img] (2.5,7) circle (5mm) [path picture={node (P2) at (path picture bounding box.center) {includegraphics[width=1cm]{example-image-b}};}] ;
node[align=center] at (0,6.2){tinytextbf{textsc{Low}}};
node[align=center] at (2.5,6.2){tinytextbf{textsc{High}}};
%links
path[every node/.style={font=sffamilysmall}]
(P2) edge [bend right] coordinate [pos=0.2] (top) (P1)
(P1) edge [bend right] (P2)
;
path (P1) edge [loop left] node {} (P1);
path (P2) edge [loop right] node {} (P2);
%%%%%%%%%%
%%% RECTANGLES %%%
node[draw, thick, dotted, rounded corners, inner xsep=3.5em, inner ysep=1em, fit=(P1) (P2)] (box) {};
node[fill=white] at (box.south) {tinytextbf{textsc{States}}};
end{tikzpicture}
end{document}
EDIT
Here is working version including an improved definition of the "Low" and "High" node position with the positioning
library and the inclusion of the tikzlings
in the nodes.
documentclass[tikz]{standalone}
usetikzlibrary{fit,positioning}
usepackage{tikzlings}
tikzset{
img/.style={circle, fill=red!40!brown!65,inner sep=0pt,outer sep=0pt},
}
begin{document}
begin{tikzpicture}
%nodes for latent state
path[img] (0,7) circle (5mm) [path picture={node (P1) at (path picture bounding box.center) {tikz[scale=0.5]{marmot}};}] ;
path[img] (2.5,7) circle (5mm) [path picture={node (P2) at (path picture bounding box.center) {tikz[scale=0.5]{cat}};}] ;
node[below=5mm of P1.center] (P1l) {tinytextbf{textsc{Low}}};
node[below=5mm of P2.center] (P2l) {tinytextbf{textsc{High}}};
%links
path[every node/.style={font=sffamilysmall}]
(P2) edge [bend right] coordinate [pos=0.2] (top) (P1)
(P1) edge [bend right] (P2)
;
path (P1) edge [loop left] node {} (P1);
path (P2) edge [loop right] node {} (P2);
%%%%%%%%%%
%%% RECTANGLES %%%
node[draw, thick, dotted, rounded corners, inner xsep=3.5em, inner ysep=1em, fit=(P1) (P2)] (box) {};
node[fill=white] at (box.south) {tinytextbf{textsc{States}}};
end{tikzpicture}
end{document}
EDIT n°2 : inclusion of heartbeat shape and resizebox
documentclass[tikz]{standalone}
usetikzlibrary{fit,positioning}
usepackage{tikzlings}
tikzset{
img/.style={circle, fill=red!40!brown!65,inner sep=0pt,outer sep=0pt},
}
usepackage{fontawesome}
begin{document}
begin{tikzpicture}
%nodes for latent state
path[img] (0,7) circle (5mm) [path picture={node[text width=1cm,align=center,anchor=center,inner sep=0pt, outer sep=0pt] (P1) at (path picture bounding box.center) {resizebox{1cm}{!}{faHeartbeat}};}] ;
path[img] (2.5,7) circle (5mm) [path picture={node[text width=1cm,align=center,anchor=center,inner sep=0pt, outer sep=0pt] (P2) at (path picture bounding box.center) {resizebox{1cm}{!}{tikz{cat}}};}] ;
node[below=5mm of P1.center] (P1l) {tinytextbf{textsc{Low}}};
node[below=5mm of P2.center] (P2l) {tinytextbf{textsc{High}}};
%links
path[every node/.style={font=sffamilysmall}]
(P2) edge [bend right] coordinate [pos=0.2] (top) (P1)
(P1) edge [bend right] (P2)
;
path (P1) edge [loop left] node {} (P1);
path (P2) edge [loop right] node {} (P2);
%%%%%%%%%%
%%% RECTANGLES %%%
node[draw, thick, dotted, rounded corners, inner xsep=3.5em, inner ysep=1em, fit=(P1) (P2)] (box) {};
node[fill=white] at (box.south) {tinytextbf{textsc{States}}};
end{tikzpicture}
end{document}
Correct answer by BambOo on August 18, 2021
A small variation.mostly off-topic of nice @ BambOo answer (+1), for fun and exercise. Main differences are in defined styles, which enable to write shorter and more clear code:
documentclass[margin=3mm]{standalone}
usepackage{newtxtext} % provide also bold small caps fonts
usepackage{tikzlings}
usetikzlibrary{arrows.meta,
fit}
begin{document}
begin{tikzpicture}[
every edge/.style = {draw,-Straight Barb},
every label/.append style = {font=scriptsizebfseriesscshape, % work with newtxtext
fill=white,inner ysep=1pt},
FIT/.style = {draw, densely dotted, rounded corners,
inner ysep=1em, fit=#1},
img/.style = {fill=yellow!50},
state/.style 2 args = {path picture={node[inner sep=0pt] (#1) at (ppbb.center)
{tikz[scale=0.6] {#2}};}}
]
defppbb{path picture bounding box}
% states
fill[img] (0,0) circle (6mm) [state={P1}{penguin[body=teal]}] ;
node (p1) [label=below:Low] at (P1.south) {};
fill[img] (3,0) circle (6mm) [state={P2}{penguin[body=red]}] ;
node (p2) [label=below:High] at (P2.south) {};
% links
path (P2) edge [bend right] (P1) % , coordinate [pos=0.2] (top)
(P1) edge [bend right] (P2)
(P1) edge [loop left] coordinate (L) (P1)
(P2) edge [loop right] coordinate (R) (P2);
%%%%%%%%%%
% automatom border
node[FIT=(L) (P1) (p2) (R),
label={[anchor=center]below:States}] {};
end{tikzpicture}
end{document}
Answered by Zarko on August 18, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP