2012-04-09 4 views
1

Я создал ориентированный граф, и через программу я узнаю все циклы, которые он содержит. После создания графика я хочу изменить цвет ребер, содержащих вершины, участвующие в цикле.Могу ли я изменить цвет ребер, содержащих определенные вершины в IGraph-Python

Я использую python igraph.

Пожалуйста, помогите

ответ

3

Что-то вроде этого:

vertex_set = set(vertices_in_cycle) 
g.es["color"] = "black" 
red_edges = g.es.select(_source_in=vertex_set, _target_in=vertex_set) 
red_edges["color"] = "red" 

Пояснение:

  1. g.es представляет собой совокупность всех ребер в графе. (Аналогично, g.vs - множество всех вершин).

  2. g.es["color"] позволяет присвоить значение атрибута всех ребер в графе color. Этот атрибут edge используется плоттером для определения того, какой цвет должен иметь край. Поэтому в строке 2 вы устанавливаете цвет всех краев на черный. (Примечание: вы можете также использовать список здесь вместо простой строки или использовать цветные обозначения HTML для пользовательских цветов).

  3. В качестве списка вы можете использовать g.es, и в этом случае вы получите конкретный край графика; например, g.es[2] даст вам край с id = 2. Это не используется здесь, но это хорошо знать.

  4. g.es.select - метод, который выбирает подмножество ребер на основе некоторых критериев. help(EdgeSeq.select) дает вам больше информации об этом; дело в том, что в строке 3 вы выбираете все ребра, для которых обе конечные точки лежат в интересующем вас наборе вершин. Выбранные края сохраняются в переменной red_edges, которая имеет тот же тип, что и g.es (то есть EdgeSeq) ,

  5. В последней строке, вы настраиваете цвет всех краев в red_edges к red, перекрывая черный цвет, который вы установили в строке 2.

Обратите внимание, что приведенный выше код не будет красить только края цикла до красного, а также все аккорды цикла.

Update: если строка 3 в приведенном выше коде не работает для вас по какой-то причине, вы можете заменить строки 2 и 3 следующего содержания:

g.es["color"] = ["red" if (edge.source in vertex_set and \ 
          edge.target in vertex_set) else "black" \ 
       for edge in g.es] 
+0

, когда я попытался осуществить вышеупомянутую закодировать ошибка возникла AttributeError: объект 'Graph' не имеет атрибута 'source' – Fyre

+0

Скорее всего, вы написали 'source_in' и' target_in' вместо '_source_in' и' _target_in' (обратите внимание на верхнее подчеркивание). Однако было бы информативным, если бы вы сказали мне, какая из приведенных выше команд дала вам эту ошибку. –

+0

да я использовал ведущее подчеркивание, но я все равно получаю ту же ошибку – Fyre

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

  • Нет связанных вопросов^_^