2014-01-16 3 views
1

Я пытаюсь построить график с igraph на Python, в соответствии со следующим кодом:Край суперпозиция в igraph (Python)

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))) 

Результат показан ниже:

enter image description here

enter image description here

Я хотел бы нанести красную стрелу на синие, так как она частично скрыта. Я попытался с чем-то вроде fig = Plot(); fig.add(g), чтобы наложить красную стрелку на другие, но тогда я не знаю, как сохранить весь сюжет в svg-файле (функция fig.save(), кажется, сохраняет только в формате png).

Вы знаете, как исправить эту проблему? Заранее спасибо за вашу помощь!

ответ

2

Пользовательский заказ на кромку еще не возможен с последней стабильной версией 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() 
+1

Большое спасибо Tamás, ваша помощь всегда очень ценится. На самом деле я пробовал что-то вроде того, что вы сказали, т. Е. Рисуя график дважды (я следил за учебником на веб-странице igraph), но потом у меня были проблемы с сохранением в формате svg. Однако кажется, что с вашим предложением, а именно с помощью target = "test.svg", проблема должна быть исправлена. Еще раз спасибо! – user2983638

Смежные вопросы