Skip to content

Commit bb5c998

Browse files
authored
plotly.io HTML functions, modular renderers framework, future flags system (#1474)
* plotly.io.renderers implementation * Use _repr_mimebundle_ to automatically display figures on repr in the Jupyter Notebook. * Browser renderers to show figure in browser tabs. Avoids writing out tmp file by create single use web server to serve the html content to the browser. * Expose renderer base classes * Auto-detect VSCode, Kaggle, and Colab environments and initialize renderer appropriately * Added IFrameRenderer. Use include_plotlyjs='directory' for iframe renderer. * Added initial to_html functions to plotly.io * Reimplement plotly.offline.plot using plotly.io.write_html/to_div. Updated tests only slightly to reflect the change in how resizing is handled now. Before there was a custom callback resize script, now we rely on the plotly.js 'responsive' config option * Reimplement plotly.offline.iplot and init_notebook_mode pio.show * Add responsive=True config when figure width/height aren't set * Add MathJax configuration when initializing HTML renderer in notebook * Reimplement HTML Renderers using the plotly.io html functions * Add support for custom JS snippets in exported HTML. Now there is a post_script argument to the HTML functions that allows a user to specify some custom JavaScript to run after plot creation. This can be used by plot/iplot to implement the previous save image behavior without needing to add explicit save image options to the HTML functions. * Remove default renderer and make rendering figure on display an option that is false by default. Now the behavior of figure display, init_notebook_mode, iplot, and plot are all backward compatible by default. * Added future flag system under _plotly_future_ to control default renderer settings and default template. * Remove legacy unused _plot_html function * Move combination renderers test to orca test suite * Add ipython to orca environment for renderer tests * Added chromium browser renderer * Fix plotly mimetype renderer when used with numpy arrays/pandas Series * Lazily initialize default renderers. This way we can keep notebook_connected as a default renderer, but it won't attempt notebook initialization unless in is explicitly shown. So this won't happen, for example, when using plotly.py in a Dash app * Use 'browser' default renderer if ipython isn't available * Trigger notebook renderer activation on `init_notebook_mode` call. This will improve backward compatibility with the legacy init_notebook_mode() function.
1 parent 706f5b0 commit bb5c998

18 files changed

+2034
-337
lines changed

Diff for: .circleci/create_conda_optional_env.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ if [ ! -d $HOME/miniconda/envs/circle_optional ]; then
1616
# Create environment
1717
# PYTHON_VERSION=3.6
1818
$HOME/miniconda/bin/conda create -n circle_optional --yes python=$PYTHON_VERSION \
19-
requests six pytz retrying psutil pandas decorator pytest mock nose poppler xarray scikit-image
19+
requests six pytz retrying psutil pandas decorator pytest mock nose poppler xarray scikit-image ipython
2020

2121
# Install orca into environment
2222
$HOME/miniconda/bin/conda install --yes -n circle_optional -c plotly plotly-orca

Diff for: _plotly_future_/__init__.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
_future_flags = set()
2+
3+
4+
def _assert_plotly_not_imported():
5+
import sys
6+
if 'plotly' in sys.modules:
7+
raise ImportError("""\
8+
The _plotly_future_ module must be imported before the plotly module""")

Diff for: _plotly_future_/renderer_defaults.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from __future__ import absolute_import
2+
from _plotly_future_ import _future_flags, _assert_plotly_not_imported
3+
4+
_assert_plotly_not_imported()
5+
_future_flags.add('renderer_defaults')

Diff for: _plotly_future_/template_defaults.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from __future__ import absolute_import
2+
from _plotly_future_ import _future_flags, _assert_plotly_not_imported
3+
4+
_assert_plotly_not_imported()
5+
_future_flags.add('template_defaults')

Diff for: _plotly_future_/v4.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from __future__ import absolute_import
2+
from _plotly_future_ import renderer_defaults, template_defaults

Diff for: plotly/__init__.py

+6
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,13 @@
3131
from plotly import (plotly, dashboard_objs, graph_objs, grid_objs, tools,
3232
utils, session, offline, colors, io)
3333
from plotly.version import __version__
34+
from _plotly_future_ import _future_flags
3435

3536
from ._version import get_versions
3637
__version__ = get_versions()['version']
3738
del get_versions
39+
40+
# Set default template here to make sure import process is complete
41+
if 'template_defaults' in _future_flags:
42+
# Set _default to skip validation
43+
io.templates._default = 'plotly'

Diff for: plotly/basedatatypes.py

+16
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,22 @@ def __repr__(self):
392392

393393
return repr_str
394394

395+
def _repr_mimebundle_(self, include, exclude, **kwargs):
396+
"""
397+
repr_mimebundle should accept include, exclude and **kwargs
398+
"""
399+
import plotly.io as pio
400+
if pio.renderers.render_on_display:
401+
data = pio.renderers._build_mime_bundle(self.to_dict())
402+
403+
if include:
404+
data = {k: v for (k, v) in data.items() if k in include}
405+
if exclude:
406+
data = {k: v for (k, v) in data.items() if k not in exclude}
407+
return data
408+
else:
409+
return None
410+
395411
def update(self, dict1=None, **kwargs):
396412
"""
397413
Update the properties of the figure with a dict and/or with

Diff for: plotly/io/__init__.py

+6
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@
44
from ._json import to_json, from_json, read_json, write_json
55

66
from ._templates import templates, to_templated
7+
8+
from ._renderers import renderers, show
9+
10+
from . import base_renderers
11+
12+
from ._html import to_html, write_html

0 commit comments

Comments
 (0)