Нет примера, доступного для `vispy.visuals.GraphVisual`. Мой код просто показывает пустой экран

#python-3.x #graphics #nodes #networkx #vispy

#python-3.x #графика #узлы #networkx #vispy

Вопрос:

Я попытался погуглить и собрать пример из многих источников. Вот что у меня есть:

 import numpy as np
from vispy import app
from vispy import visuals
from vispy.visuals.transforms import STTransform
import networkx as nx

class Canvas(app.Canvas):
    def __init__(self, **kwargs):
        super().__init__(title="Simple NetworkX Graph", keys="interactive", size=(600, 600))

        graph = nx.path_graph(8)
        #graph = nx.adjacency_matrix(
                #nx.fast_gnp_random_graph(500, 0.005, directed=True))
        layout = nx.layout.circular_layout
        self.matrix = nx.adjacency_matrix(graph)
            
        self.visual = visuals.GraphVisual(
                nx.adjacency_matrix(graph), 
                layout=layout, 
                line_color='white', arrow_type="angle_30",
                arrow_size=30, node_symbol="disc", node_size=20,
                face_color=(1, 0, 0, 0.5), border_width=0.0, animate=True,
                directed=True)
    
        self.visual.transform = STTransform((1, 1), (20, 20))
        self.show()

    #def on_resize(self, event):
        #set_viewport(0, 0, *event.physical_size)

    def on_draw(self, event):
        clear(color=True, depth=True)

if __name__ == '__main__':
    c = Canvas(title="Graph")
    app.run()
  

На выходе получается пустой (черный) экран, на котором больше ничего не отображается.

Моя цель — отобразить простой сетевой график с использованием VisPy. Вы заставили это работать и не могли бы вы опубликовать свой код / соответствующий код?

Комментарии:

1. Привет. Я основной разработчик vispy. Похоже, вы смешиваете пару интерфейсов вместе. Вы пробовали некоторые примеры в репозитории vispy? Я думаю, что проблема on_draw в том, что вы только clear редактируете, но на самом деле никогда не рисуете визуальные эффекты.

Ответ №1:

Похоже, в вашем on_draw методе отсутствует самая важная часть, которая заключается в вызове метода рисования визуального. Смотрите Пример графика из репозитория vispy:

https://github.com/vispy/vispy/blob/master/examples/basics/visuals/graph.py

Вот методы из этого примера:

 
    @property
    def visual_size(self):
        return self.physical_size[0] - 40, self.physical_size[1] - 40

    def on_resize(self, event):
        self.visual.transform.scale = self.visual_size
        vp = (0, 0, self.physical_size[0], self.physical_size[1])
        self.context.set_viewport(*vp)
        self.visual.transforms.configure(canvas=self, viewport=vp)

    def on_draw(self, event):
        self.context.clear('white')
        self.visual.draw()
        if not self.visual.animate_layout():
            self.update()
  

Ответ №2:

Один из вариантов — не использовать VisPy, а вместо этого использовать matplotlib :

 import matplotlib.pyplot as plt
import networkx as nx

G = nx.path_graph(8)
nx.draw(G)
plt.show()
  

Приведенный выше график отображается в окне очень быстро.

Другая альтернативная библиотека grave :

 import networkx as nx
import matplotlib.pyplot as plt
from grave import plot_network

# Generate a networkx graph
graph = nx.powerlaw_cluster_graph(50, 1, .2)

# Plot it
plot_network(graph)
  

который, кажется, допускает некоторые формы взаимодействия с графом (с помощью мыши).