From 0ff9a94e1f779567b51f40597ae46ca4ebd9fa62 Mon Sep 17 00:00:00 2001 From: Martin Bauer <martin.bauer@fau.de> Date: Thu, 6 Apr 2017 18:47:53 +0200 Subject: [PATCH] Moved jupytersetup --- jupytersetup.py | 123 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 jupytersetup.py diff --git a/jupytersetup.py b/jupytersetup.py new file mode 100644 index 000000000..8921cf503 --- /dev/null +++ b/jupytersetup.py @@ -0,0 +1,123 @@ +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.animation as animation +from IPython.display import HTML +from tempfile import NamedTemporaryFile +import base64 + +from IPython import get_ipython + + +VIDEO_TAG = """<video controls width="80%"> + <source src="data:video/x-m4v;base64,{0}" type="video/mp4"> + Your browser does not support the video tag. +</video>""" + + +def __anim_to_html(anim, fps): + if not hasattr(anim, '_encoded_video'): + with NamedTemporaryFile(suffix='.mp4') as f: + anim.save(f.name, fps=fps, extra_args=['-vcodec', 'libx264', '-pix_fmt', + 'yuv420p', '-profile:v', 'baseline', '-level', '3.0']) + video = open(f.name, "rb").read() + anim._encoded_video = base64.b64encode(video).decode('ascii') + + return VIDEO_TAG.format(anim._encoded_video) + + +def makeImshowAnimation(grid, gridUpdateFunction, frames=90, **kwargs): + from functools import partial + fig = plt.figure() + im = plt.imshow(grid, interpolation='none') + + def updatefig(*args, **kwargs): + image = kwargs['image'] + image = gridUpdateFunction(image) + im.set_array(image) + return im, + + return animation.FuncAnimation(fig, partial(updatefig, image=grid), frames=frames) + + +# ------- Version 1: Embed the animation as HTML5 video --------- ---------------------------------- + +def displayAsHtmlVideo(anim, fps=30, show=True, **kwargs): + try: + plt.close(anim._fig) + res = __anim_to_html(anim, fps) + if show: + return HTML(res) + else: + return HTML("") + except KeyboardInterrupt: + pass + + +# ------- Version 2: Animation is shown in extra matplotlib window ---------------------------------- + + +def displayInExtraWindow(animation, *args, **kwargs): + fig = plt.gcf() + try: + fig.canvas.manager.window.raise_() + except Exception: + pass + plt.show() + + +# ------- Version 3: Animation is shown in images that are updated directly in website -------------- + +def displayAsHtmlImage(animation, show=True, iterations=10000, *args, **kwargs): + from IPython import display + + try: + if show: + fig = plt.gcf() + if show: + animation._init_draw() + for i in range(iterations): + if show: + display.display(fig) + animation._step() + if show: + display.clear_output(wait=True) + except KeyboardInterrupt: + display.clear_output(wait=False) + + +# Dispatcher + +animation_display_mode = 'imageupdate' +display_animation_func = None + + +def disp(*args, **kwargs): + if not display_animation_func: + raise "Call set_display_mode first" + return display_animation_func(*args, **kwargs) + + +def setDisplayMode(mode): + from IPython import get_ipython + ipython = get_ipython() + global animation_display_mode + global display_animation_func + animation_display_mode = mode + if animation_display_mode == 'video': + ipython.magic("matplotlib inline") + display_animation_func = displayAsHtmlVideo + elif animation_display_mode == 'window': + ipython.magic("matplotlib qt") + display_animation_func = displayInExtraWindow + elif animation_display_mode == 'imageupdate': + ipython.magic("matplotlib inline") + display_animation_func = displayAsHtmlImage + else: + raise Exception("Unknown mode. Available modes 'imageupdate', 'video' and 'window' ") + + +ipython = get_ipython() +if ipython: + setDisplayMode('imageupdate') + ipython.magic("matplotlib inline") + matplotlib.rcParams['figure.figsize'] = (16.0, 6.0) \ No newline at end of file -- GitLab