使用 TikZ 绘制任意无加权无向图的最简单方法是什么?

使用 TikZ 绘制任意无加权无向图的最简单方法是什么?

抱歉,如果之前有人问过这个问题,但我找不到可以解决我特定问题的方法。我所看到的一切(例如) 似乎对边和节点假设了特定的模式。

我有一个任意的无权无向图,我想绘制它。它可以完全从其边集指定。我对特定的布局或外观并不特别在意。我希望节点是圆圈,标签在中间,并且图形在水平方向比垂直方向延伸得更多,以更好地利用页面,但除此之外,我并不真正在意,并且希望尽可能多地留给布局引擎。

有问题的边缘是[(1,2); (2,3); (3,4); (3,5); (3,6); (4, 7); (5, 9); (6,7); (6,10); (8,9); (9,10);]

我主要对 TikZ 解决方案感兴趣,但如果有人想建议其他东西,我也会听取。

我查看了 TikZ 手册(我能找到的关于图形绘制的两个大章节),以及这篇博文以及本网站上的其他问题,但我发现似乎没有任何东西可以解决任意图表的问题。

根据我所看到的情况,我已经尝试了几种解决方案,但都没有奏效。首先,基于这个问题(我在尝试这种方法时仅包含了前几个边):

\documentclass{article}

\usepackage{tikz}
\usepackage{shellesc}

\usetikzlibrary{graphdrawing,graphs,external}
\tikzexternalize

    \begin{tikzpicture}[->,auto,main node/.style={circle,draw},node distance=3cm]
    \node[main node] (1) {1};
    \node[main node] (2) {2};
    \node[main node] (3) {3};
    \node[main node] (4) {4};
    \node[main node] (5) {5};
    \node[main node] (6) {6};
    \node[main node] (7) {7};
    \node[main node] (8) {8};
    \node[main node] (9) {9};
    \node[main node] (10) {10};

    \path[]
        (1) edge node (2)
        (2) edge node (3)
        (3) edge node (4);
    \end{tikzpicture}
\end{document}

但这似乎把所有东西都画在了一起。其次,也是最初很有希望的,基于我在某个地方(但忘记在哪里)看到的东西:

\documentclass{article}

\usepackage{tikz}
\usepackage{shellesc}

\usetikzlibrary{graphdrawing,graphs,external}
\tikzexternalize

    \begin{tikzpicture}[nodes={shape=circle,draw}]
    \graph {
    1 -- 2,
    2 -- 3,
    3 -- 4,
    3 -- 5,
    3 -- 6,
    4 -- 7,
    5 -- 9,
    6 -- 7,
    6 -- 10,
    8 -- 9,
    9 -- 10,
    };
    \end{tikzpicture}
\end{document}

但这似乎对前两个边效果很好,然后其他所有内容都沿着页面向下增长,边贯穿所有其他节点。

显然,我做错了什么,但我不知道是什么。如果有人能向我解释我做错了什么和/或我如何才能真正实现我想要的,我将不胜感激(无论是通过发布示例还是指出正确的查找位置 - 我发现没有任何东西可以明确回答这个特定问题)。谢谢。

答案1

我的主要问题是我并不真正了解无向图到底是什么。但是,我有一些评论可以让你得到你想要的。首先,如果你想使用图形绘制算法,你需要指定一个。事实证明,现在你需要一个修补。我要强调的是,这在 LaTeX 中非常不常见,但无论如何,补丁解决了这个问题。现在我们需要就算法达成一致。以下是一个例子:

\documentclass{article}
\usepackage{luacode}
\usepackage{tikz}

\usetikzlibrary{graphdrawing,graphs}
\begin{luacode*}
function pgf_lookup_and_require(name)
    local sep = package.config:sub(1,1)
    local function lookup(name)
        local sub = name:gsub('%.',sep)  
        if kpse.find_file(sub, 'lua') then
            require(name)
        elseif kpse.find_file(sub, 'clua') then
            collectgarbage('stop') 
            require(name)
            collectgarbage('restart')
        else
            return false
        end
        return true
    end
    return
        lookup('pgf.gd.' .. name .. '.library') or
        lookup('pgf.gd.' .. name) or
        lookup(name .. '.library') or
        lookup(name) 
end
\end{luacode*}
\usegdlibrary{force}
\begin{document}
\begin{tikzpicture}[nodes={shape=circle,draw}]
    \graph[spring layout] {
    1 -- 2,
    2 -- 3,
    3 -- 4,
    3 -- 5,
    3 -- 6,
    4 -- 7,
    5 -- 9,
    6 -- 7,
    6 -- 10,
    8 -- 9,
    9 -- 10,
    };
\end{tikzpicture}
\end{document}

在此处输入图片描述

在我看来,它看起来相当“无方向性”。但是,如果你给我更多的反馈,我会努力让它更加如此。

如果你想要一些随机性,你可能想要这样做

\documentclass{article}
\usepackage{luacode}
\usepackage{tikz}

\usetikzlibrary{graphdrawing,graphs}
\begin{luacode*}
function pgf_lookup_and_require(name)
    local sep = package.config:sub(1,1)
    local function lookup(name)
        local sub = name:gsub('%.',sep)  
        if kpse.find_file(sub, 'lua') then
            require(name)
        elseif kpse.find_file(sub, 'clua') then
            collectgarbage('stop') 
            require(name)
            collectgarbage('restart')
        else
            return false
        end
        return true
    end
    return
        lookup('pgf.gd.' .. name .. '.library') or
        lookup('pgf.gd.' .. name) or
        lookup(name .. '.library') or
        lookup(name) 
end
\end{luacode*}
\usegdlibrary{force}
\begin{document}
\begin{tikzpicture}[nodes={shape=circle,draw}]
    \graph[spring layout,node distance=2cm] {
    1 -- 2[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    2 -- 3[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    3 -- 4[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    3 -- 5[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    3 -- 6[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    4 -- 7[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    5 -- 9[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    6 -- 7,
    6 -- 10[nudge up={(rand-0.5)*3mm},nudge right={(rand-0.5)*3mm}],
    8 -- 9,
    9 -- 10,
    };
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容