Как изменить цвет контура node In networkx?

Я относительно новичок в сети и рисую с использованием matplotlib.pyplot и хотел бы знать, как изменить цвет (или другие атрибуты, такие как вес) контура node. По "контуру" я не имею в виду дугу или грань между двумя узлами; Я имею в виду тонкую черную линию вокруг круга, которая по умолчанию используется для представления node при построении сети.

Так, например, когда я делаю график, который имеет только один node и отображает его:

from networkx import *
import matplotlib.pyplot as plt
plt.ion()
G = Graph()
G.add_node(1)
draw(G)

Я вижу один красный node с тонким черным контуром (и черным "1" внутри него, который является меткой node). Как изменить цвет этого контура от черного до, скажем, красного ( "# FF0000" ) или другого цвета? В качестве альтернативы, я могу полностью отключить отображение контура?

Я предполагаю, что должен быть атрибут, аналогичный edge_color или node_color, который я могу установить. Однако я не смог найти такой атрибут с помощью веб-поиска, в документации по сети или просмотрев примеры галереи. Если кто-то может указать мне на соответствующий атрибут (ы), который будет очень признателен. Спасибо!

Ответы

Ответ 1

Хорошо, это хакка, но это работает. Вот что я придумал.

Проблема

networkx.draw() вызывает networkx.draw_networkx_nodes(), который затем вызывает pyplot.scatter() для рисования узлов. Проблема в том, что ключевое слово args, принятое draw_networkx_nodes(), не передается на scatter(). (источник здесь)


Чтобы решить эту проблему, я в основном разбил networkx.draw() на свои компоненты: draw_networkx_nodes, draw_networkx_edges и draw_networkx_labels.

Решение

Мы можем взять возвращаемое значение draw_networkx_nodes() - a PathCollection - и работать с ним: вы можете использовать PathCollection.set_edgecolor() или PathCollection.set_edgecolors() как с цветом, так и с списком соответственно.

Пример кода:

from networkx import *
import matplotlib.pyplot as plt
G = Graph()
G.add_node(1)
# Need to specify a layout when calling the draw functions below
# spring_layout is the default layout used within networkx (e.g. by `draw`)
pos = spring_layout(G)
nodes = draw_networkx_nodes(G, pos)
# Set edge color to red
nodes.set_edgecolor('r')
draw_networkx_edges(G, pos)
# Uncomment this if you want your labels
## draw_networkx_labels(G, pos)
plt.show()

Если вы собираетесь использовать это много, вероятно, имеет смысл (IMO) просто переопределить draw_networkx_nodes, чтобы передать kwargs на scatter. Но выше будет работать.

Чтобы полностью удалить края маркера, просто установите цвет None вместо 'r'.

Ответ 2

Начиная с NetworkX 2.1, edgecolors аргумент edgecolors для draw_networkx_nodes() (а также для draw() поскольку он в конечном итоге вызывает draw_networkx_nodes() для рисования узлов).

Ответ 3

Если вы хотите изменить цвет контуров узлов, вы можете просто сделать:

draw(G, linewidths=2)
ax = plt.gca() # to get the current axis
ax.collections[0].set_edgecolor("#FF0000") 

И что это.

  • ax.collections[0] - объект PathCollection, управляющий узлами
  • ax.collections[1] - объект LineCollection, управляющий ребрами, если у вас есть.

Вы можете быстро изменить многие другие свойства с помощью данной коллекции.

Ответ 4

Я знаю, что это прочный поток, но я тоже искал этот ответ и, наконец, нашел родной не-хакерский способ. Вы можете передать аргумент linewidths = 0 в функцию draw. Я думаю, что это влияет только на ширину границ node, а не на ширину края (которая управляется шириной = x).