2016-09-23 1 views
14

У меня есть массив M x N 2D: i-я строка представляет это значение N точек в момент i.График динамически меняющегося графика с использованием matplotlib в Jupyter Notebook

Я хочу визуализировать точки [1 строку массива] в виде графика, в котором значения обновляются после небольшого интервала. Таким образом, график показывает по 1 строке за раз, затем обновляет значения до следующей строки, так далее и т. Д.

Я хочу сделать это в ноутбуке jupyter. Поиск ссылочных кодов.

Я попытался следующие вещи, но не успех:

ответ

-4

Я мало знаю о matplotlib или jupyter. Тем не менее, меня интересуют графики. Я просто сделал несколько поисковых запросов и наткнулся на это post. Похоже, вам нужно отобразить график в виде HTML-видео, чтобы увидеть динамический граф.

Я пробовал этот пост. This - это ноутбук, если вы хотите попробовать. Обратите внимание, что ядро ​​(python 2) требуется для создания видео. Вы можете узнать больше об этом here.

Теперь вы хотите отобразить строку графика для строки. Я пробовал this. В этом ноутбуке у меня есть dump_data с 10 строками. Я случайным образом беру один и рисую их и показываю как видео.

Было интересно узнать о jupyter. Надеюсь это поможет.

+2

Imho, просто пишущий * «посмотрите на эту внешнюю страницу или что« * - очень плохая практика в SO. Через два года эти ссылки будут мертвы, и ваш ответ будет бесполезным. – Bart

0

В дополнение к @ 0aslam0 Я использовал код от here. Я только что изменил функцию анимации, чтобы получить следующую строку в следующий раз. Он рисует анимированную эволюцию (М шагов) всех N точек.

from IPython.display import HTML 
import numpy as np 
from matplotlib import animation 
N = 5 
M = 100 
points_evo_array = np.random.rand(M,N) 

# First set up the figure, the axis, and the plot element we want to animate 
fig = plt.figure() 
ax = plt.axes(xlim=(0, M), ylim=(0, np.max(points_evo_array))) 
lines = [] 

lines = [ax.plot([], [])[0] for _ in range(N)] 

def init():  
    for line in lines: 
     line.set_data([], []) 
    return lines 

def animate(i): 
    for j,line in enumerate(lines): 
     line.set_data(range(i), [points_evo_array[:i,j]]) 
    return lines 

# call the animator. blit=True means only re-draw the parts that have changed. 
anim = animation.FuncAnimation(fig, animate,np.arange(1, M), init_func=init, interval=10, blit=True) 

HTML(anim.to_html5_video()) 

Надеется, что это будет полезно

+0

Я тоже видел это сообщение. Но сообщение датировано 2013 годом и говорит о IPython. Сообщение, которое я упомянул, датируется 2016 годом и говорит о Jupyter (переименованной и обновленной версии IPython). – 0aslam0

+0

Я действительно загрузил ноутбук Jupyter непосредственно с этого сайта, о котором я упоминал, и немного исправим код и запустил его в Jupyter на моей машине. Похоже, отлично работает – segevara

+0

Хорошо. Не могли бы вы рассказать о спецификации вашей машины? Для меня анимация не работала. Мне пришлось преобразовать его в видео HTML, чтобы увидеть анимацию. – 0aslam0

20

Вот альтернатива, возможно, более простое решение:

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 

m = 100 
n = 100 
matrix = np.random.normal(0,1,m*n).reshape(m,n) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
plt.ion() 

fig.show() 
fig.canvas.draw() 

for i in range(0,100): 
    ax.clear() 
    ax.plot(matrix[i,:]) 
    fig.canvas.draw() 
+0

SUPER! работает как прелесть в блокноте –

+4

Это работает, но сюжет кажется очень маленьким в ноутбуке, пока он не будет полностью отображен. Когда он закончит рендеринг, он изменит размер, чтобы исправить размер. Любая идея почему? – MasterScrat

+0

Большое спасибо Graham :) –

0

Вот это библиотека, которая занимается в реальное время черчения/записи данных (joystick), хотя Я не уверен, что он работает с jupyter. Вы можете установить его, используя обычный pip install joystick.

Трудно сделать рабочее решение без дополнительной информации о ваших данных. Ниже приведен вариант:

import joystick as jk 
import numpy as np 

class test(jk.Joystick): 
    # initialize the infinite loop decorator 
    _infinite_loop = jk.deco_infinite_loop() 

    def _init(self, *args, **kwargs): 
     """ 
     Function called at initialization, see the docs 
     """ 
     # INIT DATA HERE 
     self.shape = (10, 4) # M, N 
     self.data = np.random.random(self.shape) 
     self.xaxis = range(self.shape[1]) 
     ############ 
     # create a graph frame 
     self.mygraph = self.add_frame(
        jk.Graph(name="TheName", size=(500, 500), pos=(50, 50), 
          fmt="go-", xnpts=self.shape[1], freq_up=5, bgcol="w", 
          xylim=(0, self.shape[1]-1, None, None))) 

    @_infinite_loop(wait_time=0.5) 
    def _generate_fake_data(self): # function looped every 0.5 second 
     """ 
     Loop starting with the simulation start, getting data and 
     pushing it to the graph every 0.5 seconds 
     """ 
     # NEW (RANDOM) DATA 
     new_data = np.random.random(self.shape[1]) 
     # concatenate data 
     self.data = np.vstack((self.data, new_data)) 
     # push new data to the graph 
     self.mygraph.set_xydata(self.xaxis, self.data[-1]) 

t = test() 
t.start() 

t.stop() 
t.exit() 

Этот код будет создать график, который автоматически обновляет 5 раз в секунду (freq_up = 5), в то время как новые данные (случайным образом) генерируется каждые 0,5 секунды (WAIT_TIME = 0,5) и нажата на график для отображения.

Если вы не хотите, чтобы ось Y вращалась, введите t.mygraph.xylim = (0, t.shape[1]-1, 0, 1).

+0

Не работает в записной книжке –