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

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

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

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

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

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

4 ответов


ок, это своего рода hacky, но это работает. Вот что я придумал.

Проблема

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 фактически передать кварги scatter. Но вышесказанное!--40-->будет работа.

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


С NetworkX 2.1, есть


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

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 объект регулирующего края если у вас есть.

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


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