假设我有一个像这样的 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
将连接b
和e
),但在您的情况下,d -- c
由于所有其他连接您都会以粗红色透支。
不过,我们仍然需要指定半径,而且我们无法通过 连接子图,--
因为这样会造成f -- b
,g -- 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}
输出
输出总是相同的,除了第一个具有更高的边界框。