![使用 Tikz 显示无边缘的重量](https://linux22.com/image/456366/%E4%BD%BF%E7%94%A8%20Tikz%20%E6%98%BE%E7%A4%BA%E6%97%A0%E8%BE%B9%E7%BC%98%E7%9A%84%E9%87%8D%E9%87%8F.png)
我想在图表中不可见的边缘上设置权重。我尝试使用不透明度使边缘消失并设置权重,但显然权重也会受到影响。
您有解决方案吗?谢谢!
下面是我所拥有的和我想要的一个例子。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows,shapes,automata,decorations,shadows}
\usetikzlibrary{trees}
\usetikzlibrary{fit}
\usetikzlibrary{backgrounds}
\usetikzlibrary{calc}
\usetikzlibrary{matrix}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[
auto,
mynode/.style={ellipse, draw,
inner sep=0.4mm, minimum size=7mm, font=\scriptsize,
node distance=6mm and 4mm},
void/.style={ellipse, minimum size=7mm, node distance=6mm and 4mm},
myarc/.style={thick, ->,>=triangle 45, font=\scriptsize}]
\node[mynode] (asia) {asia};
\node[mynode, below= of asia] (tub) {tub};
\draw[myarc, opacity=0] (asia) edge node{2} (tub);
\end{tikzpicture}
\end{figure}
\end{document}
答案1
在 TikZ 中,有几十种方法可以画线,也有几十种方法不画线。使用opacity = 0
(和text opacity=1
或opacity = 1
为节点重新激活它)是其中一种,但我认为这不是在这里不画线的正确方法。
该edge
操作是 TikZ 中的一个特殊操作,因为它会\path
在使用的一个操作之后创建一个额外的操作(通常为空)。它最适合用于连接节点(因此得名)。
有两件事略有不同:
新的边将从之前的起始位置开始。这意味着
\path (a) edge (b) edge (c) edge (d);
将连接
a
到b
、a
到c
和a
到d
(而不是b
到c
和c
到d
)。它使用
every edge
TikZ 用 初始化的样式draw
。(因为如果我们想将两个节点之间的连接可视化,我们通常希望用一条线连接它们。)
后者就是为什么edge
即使你说
\path [draw=none] (a) edge (b);
这个draw=none
(通常是不需要的,因为除非every path
改变样式否则\path
不会绘制任何东西)将被传递到边缘(如->
在 中一样\path[->] (a) edge (b);
),但它将被样式所否决every edge
。
这就是为什么你需要
\path[myarc] (either) edge[draw=none] node {2} (xray);
不画出该边缘或
\path[myarc, every edge/.style=] (either) edge node {2} (xray);
重置every edge
为空样式。
如果你经常需要这样做,我建议通过添加来定义一个别名
\tikzset{
no edges/.style={every edge/.style=},
no edge/.style ={draw=none}
}
在你的序言中,你可以说
\path[myarc] (either) edge[no edge] node {2} (xray);
% or
\path[myarc, no edges] (either) edge node {2} (xray);
当然,如果你只需要一条边不被绘制,你可以使用无边版本
\path (either) -- node {2} (xray);
通常不会画线。
(使用该calc
库,还($(either)!.5!(xray)$)
可以计算节点中心之间的中点 - 而沿线放置的节点将放置在节点边界之间的中间。您还会失去auto
自动放置和sloped
功能的能力。)
我擅自将您的节点放置\matrix
在matrix of nodes
风格这使得以网格方式放置节点变得非常容易,无需辅助节点或节点重叠。设置matrix of nodes
允许我们给出允许在单元格开头的两个节点之间放置的\node
任何选项。{<text of node>}
|
我已经edge
充分使用了它的效果。我还添加了一个no edge
样式(这只是一个口头名称draw=none
),其中还包括auto=false
,以便2
将更多地放置在节点之间,而不是在一条不存在的线旁边。
还有tikz-cd
包裹\matrix
即使您的图表不是可交换的,也可以在这里使用它(它在内部使用)。
这graphs
图书馆当连接一堆节点时也可以使生活变得更轻松,但需要学习一种新的但更短的语法。
代码
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, shapes.geometric, matrix}
\tikzset{
no edges/.style={every edge/.style=},
no edge/.style ={draw=none, auto=false}
}
\begin{document}
\begin{tikzpicture}[
auto,
mynode/.style= {ellipse, draw, bottom color = red!5, top color = orange!15,
black, text = black, inner sep=0.4mm, minimum size=7mm, font=\scriptsize},
myedge/.style= {thick, -, font=\scriptsize},
myarc/.style = {thick, ->, >=Triangle, font=\scriptsize}]
\matrix[matrix of nodes, nodes=mynode, row sep=6mm, column sep=3mm] {
|(asia)| asia & & & |(smoke)| smoke \\
|(tub)| tub & & |(lung)| lung \\
& |(either)| either & & |(bronc)| bronc \\
|(xray)| x-ray & & |(dysp)| dysp \\
};
\path[myedge] (tub) edge node {1} (asia)
edge node {1} (xray)
edge[myarc] node {0} (either);
\path[myarc] (either) edge node {2} (lung)
edge node {0} (dysp)
edge[no edge] node {2} (xray)
(smoke) edge node {0} (bronc)
edge node {0} (lung)
(lung) edge node {2} (bronc)
(bronc) edge node {0} (dysp);
\end{tikzpicture}
\end{document}
输出
答案2
我从来没有使用过TikZ的edge
操作,感觉很好^^
实际上,TikZ 只有一个主命令\path
;如果真的想画画,那么就将其应用于路径选项\path[draw]
或简短地\draw
;如果不想画画(“让边缘消失“用 OP 的话来说),那么就...什么也不要做,只是\path
。
\documentclass[border=5mm,tikz]{standalone}
\usetikzlibrary{shapes}
\begin{document}
\begin{tikzpicture}
\path[nodes={ellipse,draw,minimum size=7mm}]
(0,0) node (asia) {asia}
+(0,-1.5) node (tub) {tub}
+(2.5,0) node (africa) {africa}
+(-2.5,0) node (europe) {europe}
;
\path
(asia)--(tub) node[midway,right]{2}
(asia)--(africa) node[midway,above]{3}
(asia)--(europe) node[midway,below]{4}
;
\end{tikzpicture}
\end{document}