Représentation graphique de changement dynamique à l'aide de matplotlib dans le carnet de notes de Jupyter

j'ai un tableau 2D M x N: la ligne I représente la valeur de N points au temps I.

je veux visualiser les points [1 ligne du tableau] sous la forme d'un graphique où les valeurs sont mises à jour après un petit intervalle. Ainsi, le graphique montre 1 ligne à la fois, puis mettre à jour les valeurs de la ligne suivante, et ainsi de suite.

je veux le faire dans un carnet jupyter. Je cherche des codes de référence.

j'ai essayé de suivre des choses mais non succès:

18
demandé sur Engineero 2016-09-23 13:37:51

5 réponses

Voici une solution alternative, peut-être plus simple:

%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()
30
répondu Graham S 2016-10-04 13:43:17
6
répondu Anuj Gupta 2017-11-01 20:58:13

en plus de @0aslam0 j'ai utilisé le code de ici. J'ai juste changé la fonction animate pour avoir la prochaine rangée à chaque fois. Il dessine l'évolution animée (m pas) de tous les N points.

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())

j'Espère qu'il sera utile

0
répondu segevara 2016-10-04 13:05:56

Voici une bibliothèque qui traite des données de traçage / journalisation en temps réel (joystick), bien que je ne sois pas sûr que cela fonctionne avec jupyter. Vous pouvez l'installer en utilisant la syntaxe habituelle!--1-->.

difficile de faire une solution efficace sans plus de détails sur vos données. Voici une option:

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()

ce code va créer un graphique qui est auto-mise à jour 5 fois par seconde (freq_up=5), alors que les nouvelles données sont (aléatoirement) générées toutes les 0.5 secondes (wait_time=0.5) et poussées vers le graphique pour l'affichage.

si vous ne voulez pas que l'axe des Y se déplace, tapez t.mygraph.xylim = (0, t.shape[1]-1, 0, 1).

0
répondu Guillaume S 2016-10-04 19:02:36

Je ne sais pas grand chose sur matplotlib ou jupyter. Cependant, les graphiques m'intéressent. J'ai juste fait quelques recherches sur google et suis tombé sur ce post. Il semble que vous devez rendre le graphique comme une vidéo HTML pour voir un graphique dynamique.

j'ai essayé ce poste. est le carnet, si vous voulez essayer. Notez que le noyau (python 2) prend du temps à compiler la vidéo. Vous pouvez en lire plus à ce sujet ici.

Maintenant vous voulez afficher une ligne de graphique ramer. J'ai essayé . Dans ce cahier, j'ai un dump_data avec 10 rangées. J'en prends une au hasard, je les trace et je les affiche en vidéo.

Il était intéressant de se renseigner sur jupyter. Espérons que cette aide.

-6
répondu 0aslam0 2016-09-30 13:47:06