我试图根据以下代码在igraph上绘制带有igraph的图形:

import numpy as np
import igraph as ig


def make_blue(brightness):
    brightness = round(255 * brightness)
    return [255 - brightness, 255 - brightness, 255]


N = 6


adj_matr = np.random.random((N, N))
weights = sum(adj_matr.tolist(), [])

g = ig.Graph.Weighted_Adjacency(adj_matr.tolist(), mode=ig.ADJ_DIRECTED, attr="weight", loops=True)

g.vs["color"] = "rgb(224,224,224)"
g.es["arrow_size"] = 0.7



for i in range(0, pow(N, 2)):

    rgb_color = make_blue(weights[i])
    color_string = "rgb(" + str(rgb_color[0]) + "," + str(rgb_color[1]) + "," + str(rgb_color[2]) + ")"
    g.es[i]["color"] = color_string


g.es[1]["color"] = "red"

ig.plot(g, "My_Graph.svg", bbox=(700, 700), margin = 100, vertex_label=map(str, np.arange(N)))


结果如下所示:





我想将红色箭头绘制在蓝色箭头上,因为它已部分隐藏。
我已经尝试过使用fig = Plot(); fig.add(g)之类的方法将红色箭头叠加在其他箭头上,但是后来我不知道如何将整个图保存到svg文件中(功能fig.save()似乎只能保存为png格式) 。

您知道如何解决此问题吗?在此先感谢您的帮助!

最佳答案

在撰写本文时,使用igraph的最新稳定版本尚无法进行自定义边缘排序。 edge_order关键字参数最近已添加到开发版本中,您可以在GitHub repo of igraph中检查进行此工作所需的更改。

如果您不想修补igraph的副本,可以尝试先绘制图形,然后再在其顶部绘制图形,但这一次使除红色边缘以外的所有颜色都透明(将其颜色设置为rgba(0,0,0,0)) 。这可以通过以下方式完成:

fig = Plot(target="test.svg")
fig.add(g, ...add every usual plot parameter here...)
g.es["color"] = "rgba(0,0,0,0)"
g.es[your_red_edge]["color"] = "red"
fig.add(g, ...add plot parameters here again...)
fig.save()

10-04 22:23
查看更多