我试图根据以下代码在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()