我正在绘制一个tikzpicture
并尝试使其灵活。有一组符号我希望能够移动,同时保持它们的相对位置。到目前为止,我尝试在一个\draw' and using
+(x,y)' 坐标内连接命令以保持相对位置。在下图中,我希望能够将圆圈内的内容作为一个组移动。
我取得了一些进展,但我这样做的一个副作用是,我无法让这个东西在我的 S 节点之间的线的末端包含箭头。例如,如果我输入“->”而不是“--”,它就会忽略它。我像往常一样被手册淹没了。也许我错过了一种更好的方法。有什么建议可以帮助吗?
平均能量损失
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (1.5,1.5) circle (1.5cm);
\draw (0.5,1.8) node {$S_1$}
+(2,0) node {$S_2$}
+(1,-1) node {$S_3$}
+(0.4,0) -- +(1.6,0)
+(1.8,-0.20) -- +(1.2,-0.8)
+(0.2,-0.2) -- +(0.8,-0.8);
\end{tikzpicture}
%
\end{document}
我无法弄清楚如何在组内添加箭头的另一种元素是弧线。如下图所示。我知道如何将弧线作为单独的元素来实现这一点,但我无法让它在组内工作。
额外 MWE
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (1.5,1.5) circle (2.0cm);
\draw (0.5,1.8) node {$S_1$}
+(2,0) node {$S_2$}
+(1,-1) node {$S_3$}
+(0.4,0) edge[<->] +(1.6,0)
+(1.8,-0.20) edge[<->] +(1.2,-0.8)
+(0.2,-0.2) edge[<->] +(0.8,-0.8);
\draw[<->] (0.5,2.05) arc (0:270:0.3cm);
\draw[<->] (2.8,1.75) arc (-90:180:0.3cm);
\draw[<->] (1.3,0.65) arc (-225:45:0.3cm);
\end{tikzpicture}
%
\end{document}
答案1
您可以使用edge[->]
而不是--
。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (1.5,1.5) circle (1.5cm);
\draw (0.5,1.8) node {$S_1$}
+(2,0) node {$S_2$}
+(1,-1) node {$S_3$}
+(0.4,0) edge[->] +(1.6,0)
+(1.8,-0.20) edge[->] +(1.2,-0.8)
+(0.2,-0.2) edge[->] +(0.8,-0.8);
\end{tikzpicture}
%
\end{document}
对于编辑,不完全是具有指定尺寸的弧,但这应该作为起点。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (0,0) coordinate (-center) circle (1.5cm);
\draw (150:0.75) node (-s1) {$S_1$}
(30:.75) node (-s2) {$S_2$}
(-90:.75) node (-s3) {$S_3$}
(-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
(-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
(-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
(-s1.north) edge[->,bend right,distance=0.5cm,in=-45,out=-140](-s1.west)
(-s2.north) edge[->,bend right,distance=0.5cm,in=45,out=140,looseness=5] (-s2.east)
(-s3.east) edge[->,bend right,distance=0.8cm,in=40,out=140] (-s3.west);
\end{tikzpicture}
\end{document}
答案2
Harish 已经解决了箭头的问题,但如果你愿意的话,move around a group of symbols
我建议使用pic
(TiKZ 3.0 的新功能)。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
%
\tikzset{
mygroup/.pic={
\draw (0,0) coordinate (-center) circle (1.5cm);
\draw (150:0.75) node (-s1) {$S_1$}
(30:.75) node (-s2) {$S_2$}
(-90:.75) node (-s3) {$S_3$}
(-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
(-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
(-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center);
}
}
\begin{tikzpicture}[>=latex]
\pic (A) {mygroup};
\pic[rotate=15,transform shape] at (3,2) (B) {mygroup};
\pic[red, rotate=-90, transform shape] at (2.75,-1.5) (C) {mygroup};
\draw[->,blue] (A-s1) to[out=90,in=100] (B-s2);
\draw[->,blue] (A-s3) to[out=-60,in=180] (C-s2.south);
\end{tikzpicture}
%
\end{document}
更新:
图片可以有参数吗?比如说形状相同但标签不同。
是的,但需要一种新的pic
声明。下面的代码显示了如何声明 3 个参数mygroup pic
以及如何使用mygroup={1st}{2nd}{3rd}
语法分配它们。在这个答案到TikZ 3.0——`pic` 的多个参数,提出了另一种系统mygroup={1st/2nd/3rd}
。它很容易修改代码。
我确信可以定义一些default
参数,但直到现在我都无法做到。我知道如何用style
声明来做到这一点,但我无法成功pic
。在我找到解决方案(或其他人提供解决方案)之前,您必须为每个组声明所有三个参数。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
%
\tikzset{
pics/mygroup/.style n args={3}{
code = {
\draw (0,0) coordinate (-center) circle (1.5cm);
\draw (150:0.75) node (-s1) {#1}
(30:.75) node (-s2) {#2}
(-90:.75) node (-s3) {#3}
(-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
(-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center);
}
}
}
\begin{tikzpicture}[>=latex]
\pic (A) {mygroup={$S_1$}{$S_2$}{$S_3$}};
\pic[rotate=15,transform shape] at (3,2) (B) {mygroup={$S_5$}{$S_6$}{$S_7$}};
\pic[red, rotate=-90, transform shape] at (2.75,-1.5) (C) {mygroup={$S_a$}{$S_b$}{$S_c$}};
\draw[->,blue] (A-s1) to[out=90,in=100] (B-s2);
\draw[->,blue] (A-s3) to[out=-60,in=180] (C-s2.south);
\end{tikzpicture}
\end{document}
答案3
当(重新)使用组时,我使用以下方法。它允许您创建一个组,并在任何地方使用自定义 x、y 偏移和大小重复使用它。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
% define a new group of elements to be reused later
\def\mygroup#1#2{
\begin{scope}[shift={#1}, scale=#2]
% using polar coordinates here (just for example)
\draw (0,0) ++(135:1cm) node (n1) {$S_1$};
\draw (0,0) ++(45:1cm) node (n2) {$S_2$};
\draw (0,0) ++(270:1cm) node (n3) {$S_3$};
\draw [->] (n1) -- (n2);
\draw [->] (n2) -- (n3);
\draw [->] (n1) -- (n3);
\end{scope}
}
\begin{tikzpicture}[>=latex]
\draw (0,0) circle (1.5cm);
% reuse \mygroup (1st parameter is x,y-shift, 2nd is resize)
\mygroup{(0,0)}{1};
\end{tikzpicture}
\end{document}
这样,您就可以在其他组中重复使用该组,子类您的 tikz 代码的部分。
编辑(带弧的版本):
这是带有弧线的 MWE 的增强版本。这里的做法是,您可以按 x、y 坐标移动三角形图形,相应的弧线将停留在所需的节点上。我只是为三个节点 (n1、n2、n3) 添加了节点名称,并设置了相对于它们的弧线位置。
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (1.5,1.5) circle (2.0cm);
\draw (0.5,1.8) node (n1) {$S_1$}
+(2,0) node (n2) {$S_2$}
+(1,-1) node (n3) {$S_3$}
+(0.4,0) edge[<->] +(1.6,0)
+(1.8,-0.20) edge[<->] +(1.2,-0.8)
+(0.2,-0.2) edge[<->] +(0.8,-0.8);
\draw[<->] (n1.north) arc (0:270:0.3cm);
\draw[<->] (n2.east) arc (-90:180:0.3cm);
\draw[<->] (n3.south) ++(.2,.1) arc (45:-225:0.3cm);
\end{tikzpicture}
%
\end{document}
我无法将所有路径和节点定义放入一次调用中。如果没有添加额外的 ,圆弧将没有箭头draw
。
\def
我认为首选方法是通过或环境创建新形状,.pic
如上所示。如果您尝试将所有路径和节点定义放入一个调用中,您将无法微调图形。此外,在其他上下文中重用代码也会更加困难。
编辑:支持节点周围的圆形坐标(另请参阅下面的评论)
以下代码是对下面评论的回答。它引入了对围绕节点的圆形坐标的支持,以取代north, south,...
坐标。
这里有一个小片段,展示了如何使用极坐标来实现你的目标:
\documentclass[border=6mm]{standalone}
\usepackage{tikz}
\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (0,0) node (n3) {$S_3$};
\draw [dashed, red] (n3.east) |- (n3.south) -| (n3.west);
\draw [red, fill=red] (n3.south) circle (2pt);
\draw [red, fill=red] (n3.south east) circle (2pt);
\draw [red, fill=red] (n3.south west) circle (2pt);
\draw [dashed, blue] (0,0) ++(-.5,0) arc (180:360:.5cm);
\draw [blue, fill=blue] (n3) ++(-90:.5cm) circle (2pt);
\draw [blue, fill=blue] (n3) ++(-45:.5cm) circle (2pt);
\draw [blue, fill=blue] (n3) ++(-135:.5cm) circle (2pt);
\end{tikzpicture}
%
\end{document}