7
7
import sys
8
8
9
9
from contextlib import contextmanager
10
+ from functools import partial
10
11
from io import BytesIO
11
12
from typing import (
12
13
TYPE_CHECKING , Any , ClassVar , Dict , Mapping , Optional ,
19
20
)
20
21
from bokeh .themes import Theme
21
22
22
- from ..io import remove_root
23
+ from ..io import remove_root , state
23
24
from ..io .notebook import push
24
25
from ..util import escape
25
26
from ..viewable import Layoutable
@@ -250,6 +251,8 @@ class Matplotlib(Image, IPyWidget):
250
251
'interactive' , 'object' , 'dpi' , 'tight' , 'high_dpi'
251
252
]
252
253
254
+ _num = 0
255
+
253
256
@classmethod
254
257
def applies (cls , obj : Any ) -> float | bool | None :
255
258
if 'matplotlib' not in sys .modules :
@@ -269,22 +272,21 @@ def _get_widget(self, fig):
269
272
import matplotlib .backends
270
273
old_backend = getattr (matplotlib .backends , 'backend' , 'agg' )
271
274
272
- from ipympl .backend_nbagg import Canvas , FigureManager , is_interactive
275
+ from ipympl .backend_nbagg import Canvas , FigureManager
273
276
from matplotlib ._pylab_helpers import Gcf
274
277
275
278
matplotlib .use (old_backend )
276
279
277
280
def closer (event ):
278
- Gcf .destroy (0 )
281
+ canvas .mpl_disconnect (cid )
282
+ Gcf .destroy (manager )
279
283
280
284
canvas = Canvas (fig )
281
285
fig .patch .set_alpha (0 )
282
- manager = FigureManager (canvas , 0 )
283
-
284
- if is_interactive ():
285
- fig .canvas .draw_idle ()
286
-
287
- canvas .mpl_connect ('close_event' , closer )
286
+ manager = FigureManager (canvas , self ._num )
287
+ self ._num += 1
288
+ cid = canvas .mpl_connect ('close_event' , closer )
289
+ state .onload (partial (self ._initialize_canvas , manager .canvas ))
288
290
return manager
289
291
290
292
@property
@@ -303,7 +305,6 @@ def filetype(self):
303
305
def _transform_object (self , obj : Any ) -> Dict [str , Any ]:
304
306
return self ._img_type ._transform_object (self , obj )
305
307
306
-
307
308
def _imgshape (self , data ):
308
309
try :
309
310
return self ._img_type ._imgshape (data )
@@ -315,6 +316,11 @@ def _format_html(
315
316
):
316
317
return self ._img_type ._format_html (self , src , width , height )
317
318
319
+ def _transform_object (self , obj : Any ) -> Dict [str , Any ]:
320
+ if self .interactive :
321
+ return {}
322
+ return self ._img_type ._transform_object (self , obj )
323
+
318
324
def _get_model (
319
325
self , doc : Document , root : Optional [Model ] = None ,
320
326
parent : Optional [Model ] = None , comm : Optional [Comm ] = None
@@ -324,27 +330,35 @@ def _get_model(
324
330
self .object .set_dpi (self .dpi )
325
331
manager = self ._get_widget (self .object )
326
332
properties = self ._get_properties (doc )
327
- del properties ['text' ]
328
333
model = self ._get_ipywidget (
329
334
manager .canvas , doc , root , comm , ** properties
330
335
)
336
+ manager .canvas .draw ()
331
337
root = root or model
332
338
self ._models [root .ref ['id' ]] = (model , parent )
333
339
self ._managers [root .ref ['id' ]] = manager
334
340
return model
335
341
342
+ def _initialize_canvas (self , canvas ):
343
+ canvas ._device_pixel_ratio = 2 if self .high_dpi else 1
344
+ canvas ._handle_message (None , {'type' : 'initialized' }, None )
345
+
336
346
def _update (self , ref : str , model : Model ) -> None :
337
347
if not self .interactive :
338
- model .update (** self ._get_properties (model .document ))
348
+ props = self ._get_properties (model .document )
349
+ model .update (** props )
339
350
return
340
351
manager = self ._managers [ref ]
341
352
if self .object is not manager .canvas .figure :
342
353
self .object .set_dpi (self .dpi )
343
354
self .object .patch .set_alpha (0 )
344
355
manager .canvas .figure = self .object
345
356
self .object .set_canvas (manager .canvas )
346
- event = {'width' : manager .canvas ._width ,
347
- 'height' : manager .canvas ._height }
357
+ if hasattr (manager .canvas , '_size' ):
358
+ cw , ch = manager .canvas ._size
359
+ elif hasattr (manager .canvas , '_width' ):
360
+ cw , ch = manager .canvas ._width , manager .canvas ._height
361
+ event = {'width' : cw , 'height' : ch }
348
362
manager .canvas .handle_resize (event )
349
363
manager .canvas .draw_idle ()
350
364
0 commit comments