Создание графика с изображениями в качестве узлов - PullRequest
0 голосов
/ 29 декабря 2018

Я создаю график с узлами в виде изображений,

# image из http://matplotlib.sourceforge.net/users/image_tutorial.html

Я хочу создать круговую раскладку с узлом zero, расположенным вcenter.Egdelist есть [(0,1), (0,2), (0,3), (0,4), (0,5)]

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import networkx as nx

img=mpimg.imread('stinkbug.png')
G=nx.complete_graph(6)
G.node[0]['image']=img
G.node[1]['image']=img
G.node[2]['image']=img
G.node[3]['image']=img
G.node[4]['image']=img
G.node[5]['image']=img
print(G.nodes())
G.add_edge(0,1)
G.add_edge(0,2)
G.add_edge(0,3)
G.add_edge(0,4)
G.add_edge(0,5)
print(G.edges())
nx.draw_circular(G)

Но, на выходеЯ нахожу дополнительные ребра (снимок прилагается). Есть ли способ удалить эти дополнительные ребра?Я хочу только эти утверждения Egdelist это [(0,1), (0,2), (0,3), (0,4), (0,5)]. Кроме того, исходное изображение не отображается в узлах,enter image description here

Есть предложения?

1 Ответ

0 голосов
/ 29 декабря 2018

так что здесь действительно два вопроса.Во-первых, почему у вашего графа больше ребер, чем вы хотите.Это произошло потому, что вы использовали nx.complete_graph(6) для инициализации своего графа - что создает полный граф на 6 узлах.Вам лучше инициализировать пустой график, добавить узлы с метаданными изображения, а затем добавить ребра.

Чтобы узлы были нарисованы как ваше изображение, я нашел и немного адаптировал код из этого обсуждения .В нем есть несколько вещей, которые вы можете настроить, например размер изображения.Результат:

enter image description here

Надеюсь, это поможет!

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import networkx as nx

img=mpimg.imread('/Users/johanneswachs/Downloads/stink.jpeg')
G=nx.Graph()
G.add_node(0,image= img)
G.add_node(1,image= img)
G.add_node(2,image= img)
G.add_node(3,image= img)
G.add_node(4,image= img)
G.add_node(5,image= img)

print(G.nodes())
G.add_edge(0,1)
G.add_edge(0,2)
G.add_edge(0,3)
G.add_edge(0,4)
G.add_edge(0,5)
print(G.edges())
pos=nx.circular_layout(G)

fig=plt.figure(figsize=(5,5))
ax=plt.subplot(111)
ax.set_aspect('equal')
nx.draw_networkx_edges(G,pos,ax=ax)

plt.xlim(-1.5,1.5)
plt.ylim(-1.5,1.5)

trans=ax.transData.transform
trans2=fig.transFigure.inverted().transform

piesize=0.2 # this is the image size
p2=piesize/2.0
for n in G:
    xx,yy=trans(pos[n]) # figure coordinates
    xa,ya=trans2((xx,yy)) # axes coordinates
    a = plt.axes([xa-p2,ya-p2, piesize, piesize])
    a.set_aspect('equal')
    a.imshow(G.node[n]['image'])
    a.axis('off')
ax.axis('off')
plt.show()
...