Как итеративно строить графики на ноутбуке Jupyter - PullRequest
1 голос
/ 28 мая 2019

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

С помощью этого кода я могу генерировать по одной фигуре за раз, но они отображаются только после окончания итерации.

import random
import time
import networkx as nx
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
%matplotlib notebook

#Generating some random edges
M = 10
N = 4
edges = []
for i in range(M):
    s = random.randrange(N) + 1
    t = random.randrange(N) + 1
    edges.append((s,t))

G = nx.DiGraph()
G.add_nodes_from(range(1, 5))

plt.subplot(121)
plt.ion()

nx.draw(G, with_labels=True, font_weight='bold')

for edge in edges:
    plt.figure()
    G.add_edge(*edge)
    nx.draw(G, with_labels=True, font_weight='bold')
    time.sleep(1)

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

Я искал несколько дней и нашел несколько примеров работы с графиками, такими как гистограмма, круговая диаграмма и тому подобное, но я имею в виду график структуры данных, а не диаграмм.

1 Ответ

3 голосов
/ 28 мая 2019

Вот предложение с использованием FuncAnimation, которое значительно упрощает весь процесс создания анимированных / живых графиков в matplotlib

import random
import time
import networkx as nx
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
%matplotlib notebook

#Generating some random edges
M = 10
N = 4
edges = []
for i in range(M):
    s = random.randrange(N) + 1
    t = random.randrange(N) + 1
    edges.append((s,t))

G = nx.DiGraph()
G.add_nodes_from(range(1, 5))

fig = plt.figure()
ax = plt.subplot(121)

def init():
    nx.draw(G, with_labels=True, font_weight='bold')

def update(edge):
    G.add_edge(*edge)
    nx.draw(G, with_labels=True, font_weight='bold')

ani = animation.FuncAnimation(fig, update, frames=edges, interval=1000., init_func=init, repeat=False)

enter image description here

...