Для этого вам нужно установить позиции узлов как атрибуты и просто использовать заполнитель в качестве имени узла. Таким образом, один из подходов может заключаться в том, чтобы просто enumerate
узлы в том порядке, в котором они появляются, и следовать тому же logi c, что и ваш, но добавляя заархивированные элементы координат как атрибуты pos
:
x = [4.5 , 420, 67, 620, 68]
y = [6.7, 68, 56, 231, 380]
G = nx.DiGraph()
coords = list(zip(x,y))
for node, coo in enumerate(coords, start=1):
G.add_node(node, pos=coo)
if node<len(coords):
G.add_edge(node, node+1)
Затем вы можете создать словарь как node:(x,y)
, который является форматом, ожидаемым pos
в nx.draw
, и узлы таким образом расположены в указанных координатах:
nodes = G.nodes(data=True)
pos = {node:attr['pos'] for node, attr in nodes}
plt.figure(figsize=(12,5))
nx.draw(G,
nodelist=nodelist,
pos=pos,
node_size=500,
node_color='orange')
Чтобы наложить график на существующее изображение, вы должны убедиться, что они оба используют один и тот же extent
. Это красиво объясняется здесь :
При наложении нескольких изображений изображения должны иметь одинаковый размер. Это не означает, что они должны иметь одинаковую форму, но они оба должны отображаться в одной и той же системе координат, определяемой xmin, xmax, ymin, ymax
Для этого вы можете принудительно в определенной степени как для координат графика, так и для изображения. Это значение будет зависеть от размера изображения, поэтому вам придется отрегулировать экстент графика и изображения до фактического размера изображения. Я буду использовать образец изображения из klearn.datasets.load_sample_image
в качестве примера, но для вашего собственного изображения вы можете просто загрузить его с помощью matplotlib.image.imread('my_image.jpg')
.
from sklearn.datasets import load_sample_image
img = load_sample_image('flower.jpg')
x = [4.5 , 420, 67, 620, 68]
y = [6.7, 68, 56, 231, 380]
y_lim, x_lim = img.shape[:-1]
extent = 0, x_lim, 0, y_lim
G = nx.DiGraph()
coords = list(zip(x,y))
for node, coo in enumerate(coords, start=1):
G.add_node(node, pos=coo)
if node<len(coords):
G.add_edge(node, node+1)
fig = plt.figure(frameon=False, figsize=(10,19))
plt.imshow(img, extent=extent, interpolation='nearest')
nodes = G.nodes(data=True)
pos = {node:attr['pos'] for node, attr in nodes}
nx.draw(G,
nodelist=nodelist,
pos=pos,
node_size=200,
edge_color='w',
width=4,
extent=extent,
node_color='orange',
interpolation='nearest')
plt.show()