Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 538c640

Browse files
committed
Make the WebAgg backend work with the IPython notebook
1 parent 472c424 commit 538c640

7 files changed

Lines changed: 283 additions & 248 deletions

File tree

lib/matplotlib/backends/backend_webagg.py

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import os
1111
import random
1212
import socket
13+
import threading
14+
import types
1315

1416
import numpy as np
1517

@@ -30,6 +32,15 @@
3032
from matplotlib._pylab_helpers import Gcf
3133
from matplotlib import _png
3234

35+
# TODO: This should really only be set for the IPython notebook, but
36+
# I'm not sure how to detect that.
37+
try:
38+
__IPYTHON__
39+
except:
40+
_in_ipython = False
41+
else:
42+
_in_ipython = True
43+
3344

3445
def draw_if_interactive():
3546
"""
@@ -57,7 +68,30 @@ def mainloop(self):
5768

5869
WebAggApplication.start()
5970

60-
show = Show()
71+
72+
if not _in_ipython:
73+
show = Show()
74+
else:
75+
def show():
76+
class RawHTML(object):
77+
def __init__(self, content):
78+
self._content = content
79+
80+
def _repr_html_(self):
81+
return self._content
82+
83+
result = []
84+
import matplotlib._pylab_helpers as pylab_helpers
85+
for manager in pylab_helpers.Gcf().get_all_fig_managers():
86+
result.append(ipython_inline_display(manager.canvas.figure))
87+
return RawHTML('\n'.join(result))
88+
89+
90+
class ServerThread(threading.Thread):
91+
def run(self):
92+
tornado.ioloop.IOLoop.instance().start()
93+
94+
server_thread = ServerThread()
6195

6296

6397
def new_figure_manager(num, *args, **kwargs):
@@ -127,6 +161,16 @@ def __init__(self, *args, **kwargs):
127161
# messages from piling up.
128162
self._pending_draw = None
129163

164+
# TODO: I'd like to dynamically add the _repr_html_ method
165+
# to the figure in the right context, but then IPython doesn't
166+
# use it, for some reason.
167+
168+
# Add the _repr_html_ member to the figure for IPython inline
169+
# support
170+
# if _in_ipython:
171+
# self.figure._repr_html_ = types.MethodType(
172+
# ipython_inline_display, self.figure, self.figure.__class__)
173+
130174
def show(self):
131175
# show the figure window
132176
show()
@@ -199,7 +243,7 @@ def get_diff_image(self):
199243
self._png_is_old = False
200244
return self._png_buffer.getvalue()
201245

202-
def get_renderer(self):
246+
def get_renderer(self, cleared=None):
203247
# Mirrors super.get_renderer, but caches the old one
204248
# so that we can do things such as prodce a diff image
205249
# in get_diff_image
@@ -253,7 +297,6 @@ def handle_event(self, event):
253297
elif e_type == 'key_release':
254298
self.key_release_event(key)
255299
elif e_type == 'toolbar_button':
256-
print('Toolbar button pressed: ', event['name'])
257300
# TODO: Be more suspicious of the input
258301
getattr(self.toolbar, event['name'])()
259302
elif e_type == 'refresh':
@@ -435,6 +478,8 @@ def get(self):
435478
manager = Gcf.get_fig_manager(1)
436479
canvas = manager.canvas
437480

481+
self.set_header('Content-Type', 'application/javascript')
482+
438483
t = tornado.template.Template(tpl)
439484
self.write(t.generate(
440485
toolitems=NavigationToolbar2WebAgg.toolitems,
@@ -614,3 +659,27 @@ def start(cls):
614659
print("Server stopped")
615660

616661
cls.started = True
662+
663+
664+
def ipython_inline_display(figure):
665+
import matplotlib._pylab_helpers as pylab_helpers
666+
667+
WebAggApplication.initialize()
668+
if not server_thread.is_alive():
669+
server_thread.start()
670+
671+
with open(os.path.join(
672+
WebAggApplication._mpl_dirs['web_backend'],
673+
'ipython_inline_figure.html')) as fd:
674+
tpl = fd.read()
675+
676+
fignum = figure.number
677+
manager = pylab_helpers.Gcf.get_fig_manager(fignum)
678+
679+
t = tornado.template.Template(tpl)
680+
return t.generate(
681+
prefix=WebAggApplication.url_prefix,
682+
fig_id=fignum,
683+
toolitems=NavigationToolbar2WebAgg.toolitems,
684+
canvas=figure.canvas,
685+
port=WebAggApplication.port)

lib/matplotlib/backends/web_backend/all_figures.html

Lines changed: 32 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,49 @@
33
<link rel="stylesheet" href="{{ prefix }}/_static/css/page.css" type="text/css">
44
<link rel="stylesheet" href="{{ prefix }}/_static/css/boilerplate.css" type="text/css" />
55
<link rel="stylesheet" href="{{ prefix }}/_static/css/fbm.css" type="text/css" />
6-
<link rel="stylesheet" href="{{ prefix }}/_static/jquery/css/themes/base/jquery-ui.min.css" >
7-
<script src="{{ prefix }}/_static/jquery/js/jquery-1.7.1.min.js"></script>
8-
<script src="{{ prefix }}/_static/jquery/js/jquery-ui.min.js"></script>
9-
<script src="{{ prefix }}/_static/mpl.js"></script>
10-
<script src="{{ prefix }}/mpl_interface.js"></script>
6+
<link rel="stylesheet" href="{{ prefix }}/_static/jquery/css/themes/base/jquery-ui.min.css" >
7+
<script src="{{ prefix }}/_static/jquery/js/jquery-1.7.1.min.js"></script>
8+
<script src="{{ prefix }}/_static/jquery/js/jquery-ui.min.js"></script>
9+
<script src="{{ prefix }}/_static/mpl.js"></script>
10+
<script src="{{ prefix }}/mpl_interface.js"></script>
1111

12-
<script>
13-
var websocket_url_prefix = "{{ ws_uri }}";
14-
var figures = new Array();
12+
<script>
1513

16-
{% for (fig_id, _) in figures %}
17-
$(document).ready(
18-
function() {
19-
fig = new figure({{ repr(str(fig_id)) }}, websocket_url_prefix);
20-
figures.push(fig);
21-
22-
fig.focus_on_mouseover = true;
23-
24-
var toolbar_prefix = '{{ str(fig_id).replace(' ', '') }}-toolbar';
25-
init_mpl_toolbar(fig, toolbar_prefix);
26-
27-
var statusbar_prefix = '{{ str(fig_id).replace(' ', '') }}-statusbar';
28-
var status_id = init_mpl_statusbar(toolbar_prefix, statusbar_prefix);
29-
30-
var canvas_prefix = '{{ str(fig_id).replace(' ', '') }}-canvas';
31-
init_mpl_canvas(fig, '{{ str(fig_id).replace(' ', '') }}-canvas-div', canvas_prefix);
14+
{% for (fig_id, fig_manager) in figures %}
15+
{% set fig_label='Figure: {}'.format(fig_manager.canvas.figure.get_label()) %}
3216

33-
fig.finalize(canvas_prefix, toolbar_prefix, statusbar_prefix);
17+
{% if fig_label == 'Figure: ' %}
18+
{% set fig_label="Figure {}".format(fig_id) %}
19+
{% end %}
3420

35-
$(fig.canvas).attr('tabindex', {{ fig_id }});
21+
$(document).ready(
22+
function() {
23+
var main_div = $('div.figures');
24+
var header_div = $('<h2><a href="{{ prefix }}/{{ str(fig_id) }}">{{ fig_label }}</a></h2>');
25+
main_div.append(header_div);
26+
var figure_div = $('<div/>')
27+
main_div.append(figure_div);
28+
var websocket_url_prefix = "{{ ws_uri }}";
29+
var fig = new figure(
30+
{{ repr(str(fig_id)) }},
31+
websocket_url_prefix,
32+
figure_div);
33+
34+
fig.focus_on_mouseover = true;
35+
36+
$(fig.canvas).attr('tabindex', {{ fig_id }});
3637
}
3738
);
3839

3940
{% end %}
40-
</script>
41+
</script>
4142

42-
<title>MPL | WebAgg current figures</title>
43+
<title>MPL | WebAgg current figures</title>
4344

4445
</head>
45-
<body>
46+
<body onkeydown="fig.key_event(event, 'key_press');"
47+
onkeyup="fig.key_event(event, 'key_release');">
4648
<div id="mpl-warnings" class="mpl-warnings"></div>
47-
{% for (fig_id, fig_manager) in figures %}
48-
{% set fig_label='Figure: {}'.format(fig_manager.canvas.figure.get_label()) %}
49-
50-
{% if fig_label == 'Figure: ' %}
51-
{% set fig_label="Figure {}".format(fig_id) %}
52-
{% end %}
53-
54-
<div style="margin: 25px 100px;">
55-
<h2>
56-
<a href="{{ prefix }}/{{ str(fig_id) }}">
57-
{{ fig_label }}
58-
59-
</a>
60-
</h2>
61-
<div id="{{ str(fig_id).replace(' ', '') }}-canvas-div"></div>
62-
<div id="{{ str(fig_id).replace(' ', '') }}-toolbar" style="width: 700px;"></div>
63-
</div>
64-
{% end %}
65-
49+
<div class="figures" style="margin: 10px 10px;"></div>
6650
</body>
6751
</html>

0 commit comments

Comments
 (0)