График перекрытия изображения с использованием координат - PullRequest
2 голосов
/ 08 мая 2020

У меня есть два списка координат: первый для x-координат, второй для y-координат. Я пытаюсь использовать их как узлы графа.

import networkx as nx
list_of_coordinates_x = list(4.5 , 4, 67, 578, 68) #random numbers
list_of_coordinates_y = list(6.7, 3, 12, 45.555, 692)

G=nx.MultiGraph()
for i in range(len(list_of_coordinates_x)):
    G.add_node(i, x = list_of_coordinates_x[i], y = list_of_coordinates_y[i])
    if i > 0:
       G.add_edge(i-1,i)

nx.draw(G,node_size=10,with_labels=False)

Но все графы, которые у меня есть таким образом, выглядят как наборы узлов, размещенных на плоскости случайным образом. Как их зафиксировать по моим координатам на изображении? И как мне использовать для этого свой собственный файл формата 1680x1050 .jpg? После ответа на первую часть вопроса у меня получился такой график:

I have this graph

Но я хочу изобразить это на картинке вот так:

But I want to put it on a picture like this

1 Ответ

3 голосов
/ 08 мая 2020

Для этого вам нужно установить позиции узлов как атрибуты и просто использовать заполнитель в качестве имени узла. Таким образом, один из подходов может заключаться в том, чтобы просто 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')

enter image description here

Чтобы наложить график на существующее изображение, вы должны убедиться, что они оба используют один и тот же 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...