使用 Tikz 显示无边缘的重量

使用 Tikz 显示无边缘的重量

我想在图表中不可见的边缘上设置权重。我尝试使用不透明度使边缘消失并设置权重,但显然权重也会受到影响。

您有解决方案吗?谢谢!

下面是我所拥有的和我想要的一个例子。

\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=1opacity = 1为节点重新激活它)是其中一种,但我认为这不是在这里不画线的正确方法。


edge操作是 TikZ 中的一个特殊操作,因为它会\path在使用的一个操作之后创建一个额外的操作(通常为空)。它最适合用于连接节点(因此得名)。

有两件事略有不同:

  1. 新的边将从之前的起始位置开始。这意味着

    \path (a) edge (b)
              edge (c)
              edge (d);
    

    将连接abacad(而不是bccd)。

  2. 它使用every edgeTikZ 用 初始化的样式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功能的能力。)


我擅自将您的节点放置\matrixmatrix 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} 

相关内容