@@ -112,7 +112,8 @@ def render(self, **kwargs):
112
112
'if it is not in a Figure.' )
113
113
114
114
figure .header .add_child (
115
- JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.0/leaflet-dvf.markers.min.js' ), # noqa
115
+ JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.3.0/leaflet-dvf.markers.min.js' ),
116
+ # noqa
116
117
name = 'dvf_js' )
117
118
118
119
@@ -241,12 +242,14 @@ class VegaLite(Element):
241
242
242
243
def __init__ (self , data , width = None , height = None ,
243
244
left = '0%' , top = '0%' , position = 'relative' ):
244
- super (VegaLite , self ).__init__ ()
245
+ super (self . __class__ , self ).__init__ ()
245
246
self ._name = 'VegaLite'
246
247
self .data = data .to_json () if hasattr (data , 'to_json' ) else data
247
248
if isinstance (self .data , text_type ) or isinstance (data , binary_type ):
248
249
self .data = json .loads (self .data )
249
250
251
+ self .json = json .dumps (self .data )
252
+
250
253
# Size Parameters.
251
254
self .width = _parse_size (self .data .get ('width' , '100%' ) if
252
255
width is None else width )
@@ -258,22 +261,12 @@ def __init__(self, data, width=None, height=None,
258
261
259
262
def render (self , ** kwargs ):
260
263
"""Renders the HTML representation of the element."""
261
- self . json = json . dumps (self .data )
264
+ vegalite_major_version = self . _get_vegalite_major_versions (self .data )
262
265
263
266
self ._parent .html .add_child (Element (Template ("""
264
267
<div id="{{this.get_name()}}"></div>
265
268
""" ).render (this = self , kwargs = kwargs )), name = self .get_name ())
266
269
267
- self ._parent .script .add_child (Element (Template ("""
268
- var embedSpec = {
269
- mode: "vega-lite",
270
- spec: {{this.json}}
271
- };
272
- vg.embed(
273
- {{this.get_name()}}, embedSpec, function(error, result) {}
274
- );
275
- """ ).render (this = self )), name = self .get_name ())
276
-
277
270
figure = self .get_root ()
278
271
assert isinstance (figure , Figure ), ('You cannot render this Element '
279
272
'if it is not in a Figure.' )
@@ -288,21 +281,62 @@ def render(self, **kwargs):
288
281
</style>
289
282
""" ).render (this = self , ** kwargs )), name = self .get_name ())
290
283
291
- figure .header .add_child (
292
- JavascriptLink ('https://d3js.org/d3.v3.min.js' ),
293
- name = 'd3' )
284
+ if vegalite_major_version == '1' :
285
+ self ._embed_vegalite_v1 (figure )
286
+ elif vegalite_major_version == '2' :
287
+ self ._embed_vegalite_v2 (figure )
288
+ elif vegalite_major_version == '3' :
289
+ self ._embed_vegalite_v3 (figure )
290
+ else :
291
+ # Version 2 is assumed as the default, if no version is given in the schema.
292
+ self ._embed_vegalite_v2 (figure )
293
+
294
+ def _get_vegalite_major_versions (self , spec ):
295
+ try :
296
+ schema = spec ['$schema' ]
297
+ except KeyError :
298
+ major_version = None
299
+ else :
300
+ major_version = schema .split ('/' )[- 1 ].split ('.' )[0 ].lstrip ('v' )
294
301
295
- figure .header .add_child (
296
- JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.min.js' ), # noqa
297
- name = 'vega' )
302
+ return major_version
298
303
299
- figure .header .add_child (
300
- JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega-lite/1.3.1/vega-lite.min.js' ), # noqa
301
- name = 'vega-lite' )
304
+ def _embed_vegalite_v3 (self , figure ):
305
+ self ._vega_embed ()
302
306
303
- figure .header .add_child (
304
- JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.min.js' ), # noqa
305
- name = 'vega-embed' )
307
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega@4' ), name = 'vega' )
308
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega-lite@3' ), name = 'vega-lite' )
309
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega-embed@3' ), name = 'vega-embed' )
310
+
311
+ def _embed_vegalite_v2 (self , figure ):
312
+ self ._vega_embed ()
313
+
314
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega@3' ), name = 'vega' )
315
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega-lite@2' ), name = 'vega-lite' )
316
+ figure .header .add_child (JavascriptLink ('https://cdn.jsdelivr.net/npm/vega-embed@3' ), name = 'vega-embed' )
317
+
318
+ def _vega_embed (self ):
319
+ self ._parent .script .add_child (Element (Template ("""
320
+ vegaEmbed({{this.get_name()}}, {{this.json}})
321
+ .then(function(result) {})
322
+ .catch(console.error);
323
+ """ ).render (this = self )), name = self .get_name ())
324
+
325
+ def _embed_vegalite_v1 (self , figure ):
326
+ self ._parent .script .add_child (Element (Template ("""
327
+ var embedSpec = {
328
+ mode: "vega-lite",
329
+ spec: {{this.json}}
330
+ };
331
+ vg.embed(
332
+ {{this.get_name()}}, embedSpec, function(error, result) {}
333
+ );
334
+ """ ).render (this = self )), name = self .get_name ())
335
+
336
+ figure .header .add_child (JavascriptLink ('https://d3js.org/d3.v3.min.js' ), name = 'd3' )
337
+ figure .header .add_child (JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega/2.6.5/vega.js' ), name = 'vega' ) # noqa
338
+ figure .header .add_child (JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega-lite/1.3.1/vega-lite.js' ), name = 'vega-lite' ) # noqa
339
+ figure .header .add_child (JavascriptLink ('https://cdnjs.cloudflare.com/ajax/libs/vega-embed/2.2.0/vega-embed.js' ), name = 'vega-embed' ) # noqa
306
340
307
341
308
342
class GeoJson (Layer ):
@@ -444,7 +478,8 @@ def style_data(self):
444
478
445
479
for feature in self .data ['features' ]:
446
480
feature .setdefault ('properties' , {}).setdefault ('style' , {}).update (self .style_function (feature )) # noqa
447
- feature .setdefault ('properties' , {}).setdefault ('highlight' , {}).update (self .highlight_function (feature )) # noqa
481
+ feature .setdefault ('properties' , {}).setdefault ('highlight' , {}).update (
482
+ self .highlight_function (feature )) # noqa
448
483
return json .dumps (self .data , sort_keys = True )
449
484
450
485
def _get_self_bounds (self ):
@@ -559,11 +594,13 @@ def style_data(self):
559
594
a corresponding JSON output.
560
595
561
596
"""
597
+
562
598
def recursive_get (data , keys ):
563
599
if len (keys ):
564
600
return recursive_get (data .get (keys [0 ]), keys [1 :])
565
601
else :
566
602
return data
603
+
567
604
geometries = recursive_get (self .data , self .object_path .split ('.' ))['geometries' ] # noqa
568
605
for feature in geometries :
569
606
feature .setdefault ('properties' , {}).setdefault ('style' , {}).update (self .style_function (feature )) # noqa
@@ -700,8 +737,8 @@ def __init__(self, fields, aliases=None, labels=True,
700
737
' the same length.'
701
738
assert isinstance (labels , bool ), 'labels requires a boolean value.'
702
739
assert isinstance (localize , bool ), 'localize must be bool.'
703
- assert 'permanent' not in kwargs , 'The `permanent` option does not ' \
704
- 'work with GeoJsonTooltip.'
740
+ assert 'permanent' not in kwargs , 'The `permanent` option does not ' \
741
+ 'work with GeoJsonTooltip.'
705
742
706
743
self .fields = fields
707
744
self .aliases = aliases
@@ -851,7 +888,7 @@ class Choropleth(FeatureGroup):
851
888
... highlight=True)
852
889
"""
853
890
854
- def __init__ (self , geo_data , data = None , columns = None , key_on = None , # noqa
891
+ def __init__ (self , geo_data , data = None , columns = None , key_on = None , # noqa
855
892
bins = 6 , fill_color = 'blue' , nan_fill_color = 'black' ,
856
893
fill_opacity = 0.6 , nan_fill_opacity = None , line_color = 'black' ,
857
894
line_weight = 1 , line_opacity = 1 , name = None , legend_name = '' ,
@@ -1197,6 +1234,7 @@ class ColorLine(FeatureGroup):
1197
1234
A ColorLine object that you can `add_to` a Map.
1198
1235
1199
1236
"""
1237
+
1200
1238
def __init__ (self , positions , colors , colormap = None , nb_steps = 12 ,
1201
1239
weight = None , opacity = None , ** kwargs ):
1202
1240
super (ColorLine , self ).__init__ (** kwargs )
0 commit comments