Как отображать значки изображений на узлах в NetworkX - PullRequest
0 голосов
/ 03 июля 2019

Я использую модуль NetworkX для представления сети систем инфраструктуры. В этих системах узлы и ребра состоят из различных типов объектов, и я хотел бы использовать некоторые значки, представляющие их типы, вместо круга, звезды или квадрата.

G = nx.Graph()
G.add_edge('a', 'b')
nx.draw(G, labels={'a':'img1', 'b':'img2'}, with_labels=True)
plt.show()

Очевидно, мой сценарий создает график с метками 'img1' и 'img2'. Я ищу способ отображения двух значков вместо заполненных кругов и надписей.

1 Ответ

0 голосов
/ 03 июля 2019

Вы можете создать сюжет с помощью networkx и получить указатель на фигуру.Затем используйте matplotlib, чтобы построить его поверх него.

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import glob
from numpy import sqrt
import glob

path = 'some/folder/with/png/files'
files = [f for f in glob.glob(path + "*.png")]
img = []
for f in files:
    img.append(mpimg.imread(f))
N = len(files)

# generate graph
G = nx.watts_strogatz_graph(N,4,0.2)
pos=nx.spring_layout(G,k=3/sqrt(N))

# draw with images on nodes
nx.draw_networkx(G,pos,width=3,edge_color="r",alpha=0.6)
ax=plt.gca()
fig=plt.gcf()
trans = ax.transData.transform
trans2 = fig.transFigure.inverted().transform
imsize = 0.1 # this is the image size
for n in G.nodes():
    (x,y) = pos[n]
    xx,yy = trans((x,y)) # figure coordinates
    xa,ya = trans2((xx,yy)) # axes coordinates
    a = plt.axes([xa-imsize/2.0,ya-imsize/2.0, imsize, imsize ])
    a.imshow(img[n])
    a.set_aspect('equal')
    a.axis('off')
plt.show()

Найдено в https://gist.github.com/munthe/7de513dc886917860f7b960a51c95e10

Здесь - пример, который, кажется, строится по краям вместо узлов.

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