抱歉,如果之前有人问过这个问题,但我找不到可以解决我特定问题的方法。我所看到的一切(例如这) 似乎对边和节点假设了特定的模式。
我有一个任意的无权无向图,我想绘制它。它可以完全从其边集指定。我对特定的布局或外观并不特别在意。我希望节点是圆圈,标签在中间,并且图形在水平方向比垂直方向延伸得更多,以更好地利用页面,但除此之外,我并不真正在意,并且希望尽可能多地留给布局引擎。
有问题的边缘是[(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}