从子图中删除一个节点,同时保持其他节点的位置

从子图中删除一个节点,同时保持其他节点的位置

假设我有一个像这样的 tikz 图:

在此处输入图片描述

\documentclass{standalone}

\usepackage{tikz}
    \usetikzlibrary{graphs,graphs.standard}

\tikzset{v-label/.style={
every node/.style={circle,draw,minimum size=1.5em,inner sep=1},}} 

\begin{document}

\begin{tikzpicture}[v-label,]
\graph[clockwise,radius=1cm,]{
subgraph I_n [n=5,V={f,g,h,i,j},]--subgraph C_n [n=5,V={a,b,c,d,e}];
f--h--j--g--i--f;
{[edges={very thick,red,}]e--j--g--b--c--h--f--i--d--e};};
\end{tikzpicture}

\end{document}

我希望删除一个顶点(例如 a)和所有关联边,同时保留图的其余部分。如下所示:

在此处输入图片描述

最好的方法是什么?我曾考虑过手动定位顶点 b、...、e,但一定有更好的方法,不是吗?

答案1

一个坐标

有了这个小修复subgraph I_n从我最近的回答中你可以定义

\tikzgraphsset{
  hide me/.style={
    shape=coordinate,
    target edge style=move to,
    source edge style=move to}}

并按如下方式使用它:

   subgraph I_n [n=5,V={f,g,h,i,j}]
-- subgraph C_n [n=5,V={a[hide me],b,c,d,e}];

(我们也可以使用draw=none而不是move to。)

不幸的是,边界框将包含该坐标,并且该选项overlay将不起作用。

不可见节点

有趣的是,它与真实节点一起工作,即

\tikzgraphsset{
  hide me/.style={
    draw=none, fill=none, overlay,
    /utils/exec=\def\tikzgraphnodetext{},
    target edge style=move to,
    source edge style=move to}

因为我们不想让节点的名称显示出来,所以我们要么使用a/[hide me](这样节点的文本就是/和之间的部分[,即什么都没有),要么像我在这里所做的那样,我们将其设置为{}

提到的修复是针对语法a[hide me]而不是样式的hide me

仅四个节点

第三,你可以只放置四个节点:

 subgraph I_n [n=5,V={f,g,h,i,j}];
{[circular placement, /tikz/shift=(-90:1cm), radius=2cm,
  chain polar shift=(-72:0cm), phase=18] b -- c -- d -- e};

chain polar shift值确保节点放置在与之前相同的半径上,距离为 72°(顺时针)。该phase值确保b节点放置在与之前相同的位置。(最初,该值会90导致第一个节点始终位于顶部。)

/tikz/shift我无法确切地告诉你为什么这是必要的。它看起来使用节点(前一个子图的第一个节点)作为新的中心。并且这个节点按照默认位置f放置。at (90:1cm)

仅使用四个节点subgraph I_n

我们可以使用内置子图的一些神奇功能

subgraph I_n [n=5, V={f,g,h,i,j}];
subgraph I_n [n=4, V={b,c,d,e}, radius=2cm, 
              group polar shift=(-72:0cm), phase=18];
d -- c;

我们必须手动指定连接(subgraph C_n将连接be),但在您的情况下,d -- c由于所有其他连接您都会以粗红色透支。

不过,我们仍然需要指定半径,而且我们无法通过 连接子图,--因为这样会造成f -- bg -- c等等。我们或许可以分阶段处理第一个子图并重新排序名称,然后……

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs.standard}
\makeatletter
\tikzgraphsset{
  declare={subgraph I_n}{
    \foreach \tikz@lib@graph@node@num in \tikzgraphV
      {[parse/.expand once=\tikz@lib@graph@node@num]}}}
\makeatother
\tikzset{
  v-label/.style={
    every node/.style={circle,draw,minimum size=1.5em,inner sep=1}}}
\tikzgraphsset{% shortcut
  connect without a/.style={
    parse={f--h--j--g--i--f;
          {[edges={very thick,red}] e--j--g--b--c--h--f--i--d--e};}}}
\begin{document}
\tikz[
  v-label,
  graphs/hide me/.style={
    shape=coordinate,
    target edge style=move to,
    source edge style=move to}
]
\graph[clockwise, radius=1cm]{
  subgraph I_n [n=5, V={f,g,h,i,j}]
--subgraph C_n [n=5, V={a[hide me],b,c,d,e}];
  {[connect without a]};
};

\tikz[
  v-label,
  graphs/hide me/.style={
    draw=none, fill=none, overlay,
    /utils/exec=\def\tikzgraphnodetext{},
    target edge style=move to,
    source edge style=move to}
]
\graph[clockwise, radius=1cm]{
  subgraph I_n [n=5, V={f,g,h,i,j}]
--subgraph C_n [n=5, V={a[hide me],b,c,d,e}];
  {[connect without a]};
};

\tikz[v-label]
\graph[clockwise, radius=1cm]{
   subgraph I_n [n=5, V={f,g,h,i,j}];
  {[circular placement, /tikz/shift=(-90:1cm), radius=2cm,
   chain polar shift=(-72:0cm), phase=18] b -- c -- d -- e};
  {[connect without a]};
};

\tikz[v-label]
\graph[clockwise, radius=1cm]{
  subgraph I_n [n=5, V={f,g,h,i,j}];
  subgraph I_n [n=4, V={b,c,d,e}, radius=2cm, 
                group polar shift=(-72:0cm), phase=18];
  d -- c;
  {[connect without a]};
};
\end{document}

输出

输出总是相同的,除了第一个具有更高的边界框。

在此处输入图片描述

相关内容