В моем предыдущем вопросе ( Как анимировать несколько столбцов в виде точек с помощью matplotlib из кадра данных pandas с NaN в python ) мне удалось анимировать несколько точек из кадра данных в качестве анимации.
Однако я хотел установить фон для анимации в виде сетевого графика, чтобы казалось, что точки движутся по линиям сети.
Использование кода из Как анимировать несколько столбцов как точки с помощью matplotlib из pandas dataframe с NaN в python
Я создал новый пример MCV, код которого приведен ниже:
import random
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import math
import pandas as pd
from matplotlib import animation
#from JSAnimation import IPython_display
%matplotlib inline
# initialise graph object
G = nx.Graph()
color_map =[]
G.add_node(1, pos=(1, 0)); color_map.append('r')
G.add_node(2, pos=(2, 0)); color_map.append('r')
G.add_node(3, pos=(3, -1)); color_map.append('r')
G.add_node(4, pos=(3, 1)); color_map.append('r')
G.add_node(5, pos=(4, -1)) ;color_map.append('r')
G.add_node(6, pos=(4, 1)); color_map.append('r')
G.add_node(7, pos=(5, 0)); color_map.append('r')
G.add_node(8, pos=(6, 0)); color_map.append('r')
e = [(1, 2, 1),
(2, 3, 1),
(2, 4, 2),
(3, 5, 5),
(4, 6, 2),
(5, 7, 1),
(6, 7, 2),
(7, 8, 1)]
G.add_weighted_edges_from(e)
labels = nx.get_edge_attributes(G,'weight')
nx.draw(G,nx.get_node_attributes(G, 'pos'))
nx.draw_networkx_edge_labels(G,nx.get_node_attributes(G, 'pos'),edge_labels=labels)
nx.draw_networkx_labels(G,nx.get_node_attributes(G, 'pos'))
df_x = pd.DataFrame(data=
np.array(
[[np.NaN, np.NaN, np.NaN, np.NaN],
[1, np.nan, np.NaN,np.NaN],
[1.5, 4, np.NaN,np.NaN],
[2, 5, 3,4]]
), index= [1, 2, 3, 4], columns=[1, 2, 3, 4])
print(df_x)
df_y = pd.DataFrame(data=np.array(
[[np.NaN, np.NaN, np.NaN, np.NaN],
[0, np.nan, np.NaN,np.NaN],
[0, -1, np.NaN,np.NaN],
[0, 0, 1,1]]
), index= [1, 2, 3, 4], columns=[1, 2, 3, 4])
%matplotlib notebook
from matplotlib import animation
#from JSAnimation import IPython_display
#from IPython.display import HTML
fig = plt.figure(figsize=(10,10))
ax = plt.axes()
nx.draw(G,nx.get_node_attributes(G, 'pos'),node_size = 10)
n_steps = df_x.index
graph, = plt.plot([],[],'o')
def get_data_x(i):
return df_x.loc[i]
def get_data_y(i):
return df_y.loc[i]
def animate(i):
x = get_data_x(i)
y= get_data_y(i)
graph.set_data(x,y)
return graph,
animation.FuncAnimation(fig, animate, frames=n_steps, repeat=True, blit = True)
Это создает работоспособную анимацию, которая работает.Но, тем не менее, когда я использую очень большой набор данных (индекс кадра данных pandas составляет ~ 8000 строк * 800 столбцов вместо примера набора данных pandas, который я разместил), анимация занимает очень длинный (час или около того) для рендеринга ив большинстве случаев происходит сбой моего браузера (google chrome).
Поэтому я подумал, может быть из-за необходимости перерисовывать график сетей в каждом кадре?Как я могу установить фон в качестве графа networkx?С этого момента это просто построение точек, верно?Мой реальный график немного больше (~ 5000 узлов, ~ 6000 ребер).
Надеюсь, любой может помочь мне ускорить рендеринг анимации!