Как изменить цвет контура 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).