Как изменить цвет контура узла в 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'
.
если вы хотите изменить цвет контура узлы, вы можете просто сделать:
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).