Note
Go to the end to download the full example code.
彩虹着色#
生成一个包含13个节点的完全图,并以圆形布局排列,边根据节点距离进行着色。节点距离由沿着圆上任意两点之间的弧经过的最少节点数给出。
这类图是Ringel猜想的研究对象,该猜想指出:任何包含``2n + 1``个节点的完全图都可以被任何包含``n + 1``个节点的树平铺(即树的副本可以放置在完全图上,使得完全图的每条边恰好被覆盖一次)。边的着色有助于确定如何放置树的副本。
参考资料#
https://www.quantamagazine.org/mathematicians-prove-ringels-graph-theory-conjecture-20200219/
import matplotlib.pyplot as plt
import networkx as nx
# 使用matplotlib的tableau颜色进行彩虹颜色映射
node_dist_to_color = {
1: "tab:red",
2: "tab:orange",
3: "tab:olive",
4: "tab:green",
5: "tab:blue",
6: "tab:purple",
}
# 创建一个具有奇数个节点的完整图
nnodes = 13
G = nx.complete_graph(nnodes)
# 一个有 (2n + 1) 个节点的图需要 n 种颜色来给边着色
n = (nnodes - 1) // 2
ndist_iter = list(range(1, n + 1))
# 利用圆对称性来确定节点距离
ndist_iter += ndist_iter[::-1]
def cycle(nlist, n):
return nlist[-n:] + nlist[:-n]
# 围绕圆圈旋转节点,并根据每个边的位置分配颜色
# 节点间距
nodes = list(G.nodes())
for i, nd in enumerate(ndist_iter):
for u, v in zip(nodes, cycle(nodes, i + 1)):
G[u][v]["color"] = node_dist_to_color[nd]
pos = nx.circular_layout(G)
# 创建一个1:1纵横比的图形以保持圆形。
fig, ax = plt.subplots(figsize=(8, 8))
node_opts = {"node_size": 500, "node_color": "w", "edgecolors": "k", "linewidths": 2.0}
nx.draw_networkx_nodes(G, pos, **node_opts)
nx.draw_networkx_labels(G, pos, font_size=14)
# 从边缘数据中提取颜色
edge_colors = [edgedata["color"] for _, _, edgedata in G.edges(data=True)]
nx.draw_networkx_edges(G, pos, width=2.0, edge_color=edge_colors)
ax.set_axis_off()
fig.tight_layout()
plt.show()
Total running time of the script: (0 minutes 0.072 seconds)