考虑以下代码:
\documentclass{article}
\usepackage{tkz-graph}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\SetGraphUnit{2}
\Vertex[x=0,y=0]{1}
\Vertex[x=2,y=0]{2}
\Vertex[x=2,y=2]{3}
\Vertex[x=0,y=2]{4}
%%
\Edge(1)(2)
\Edge(2)(3)
\Edge(3)(4)
\Edge(4)(1)
%%
\Vertex[x=2,y=4]{5}
\Vertex[x=4,y=4]{6}
\Vertex[x=4,y=6]{7}
\Vertex[x=2,y=6]{8}
%%
\Edge(4)(5)
\Edge(5)(6)
\Edge(6)(7)
\Edge(7)(8)
\Edge(8)(5)
%%
\Vertex[x=4,y=0]{9}
\Vertex[x=6,y=0]{10}
\Vertex[x=6,y=2]{11}
\Vertex[x=4,y=2]{12}
%%
\Edge(9)(10)
\Edge(10)(11)
\Edge(11)(12)
\Edge(12)(9)
\Edge(11)(6)
%%
\end{tikzpicture}
\end{figure}
\end{document}
这应该生成:
问题:如何在三个 4 节点团上添加彩色集群。我想要这样的东西:
答案1
使用纯 TikZ 和库fit
可以做到这一点。我添加了backgrounds
库并将这些框放在边缘和顶点后面。我还选择了仅 a fill opacity
(而不是draw opacity
),这意味着边框仍然完全不透明。还有一个包罗万象的opacity
钥匙。
这rotate fit
钥匙对于红色方框来说至关重要。
由于该fit
库在确定大小时仅检查北、东、南和西锚点,因此我们必须明确给出四个坐标的列表。
在这个简单例子中,我还明确给出了旋转角度。如果您需要自动实现这一点,则需要做更多工作。
代码
\documentclass[tikz]{standalone}
\usepackage{tkz-graph}
\usetikzlibrary{fit}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[
fitty/.style={
fill opacity=.7,
draw=#1!80,
fill=#1!50,
rounded corners,
}
]
\SetGraphUnit{2}
\Vertex[x=0,y=0]{1} \Vertex[x=2,y=0]{2}
\Vertex[x=2,y=2]{3} \Vertex[x=0,y=2]{4}
%%
\Edge(1)(2) \Edge(2)(3)
\Edge(3)(4) \Edge(4)(1)
%%
\Vertex[x=2,y=4]{5} \Vertex[x=4,y=4]{6}
\Vertex[x=4,y=6]{7} \Vertex[x=2,y=6]{8}
%%
\Edge(4)(5) \Edge(5)(6)
\Edge(6)(7) \Edge(7)(8)
\Edge(8)(5)
%%
\Vertex[x=4,y=0]{9} \Vertex[x=6,y=0]{10}
\Vertex[x=6,y=2]{11} \Vertex[x=4,y=2]{12}
%%
\Edge(9)(10) \Edge(10)(11)
\Edge(11)(12) \Edge(12)(9)
\Edge(11)(6)
%%
\begin{scope}[on background layer]
\foreach \corners in {(8)(6), (1)(3), (9)(11)}
\node[fitty=blue, fit=\corners]{};
\foreach \rot/\corners in {
45/(4.south west) (5.north east)(4.north west) (5.south east),
-45/(6.north west)(11.south east)(6.north east)(11.south west)}
\node[rotate fit=\rot, fit=\corners, fitty=red]{};
\end{scope}
\end{tikzpicture}
\end{document}