diff --git a/plotly/plotly/plotly.py b/plotly/plotly/plotly.py index e3ba3fa4292..926aa354ac3 100644 --- a/plotly/plotly/plotly.py +++ b/plotly/plotly/plotly.py @@ -163,33 +163,8 @@ def plot(figure_or_data, validate=True, **plot_options): False: do not open plot in the browser, but do return the unique url """ - if isinstance(figure_or_data, dict): - figure = figure_or_data - elif isinstance(figure_or_data, list): - figure = {'data': figure_or_data} - else: - raise exceptions.PlotlyError("The `figure_or_data` positional argument " - "must be either `dict`-like or " - "`list`-like.") - if validate: - try: - tools.validate(figure, obj_type='Figure') - except exceptions.PlotlyError as err: - raise exceptions.PlotlyError("Invalid 'figure_or_data' argument. " - "Plotly will not be able to properly " - "parse the resulting JSON. If you " - "want to send this 'figure_or_data' " - "to Plotly anyway (not recommended), " - "you can set 'validate=False' as a " - "plot option.\nHere's why you're " - "seeing this error:\n\n{0}" - "".format(err)) - if not figure['data']: - raise exceptions.PlotlyEmptyDataError( - "Empty data list found. Make sure that you populated the " - "list of data objects you're sending and try again.\n" - "Questions? support@plot.ly" - ) + figure = tools.return_figure_from_figure_or_data(figure_or_data, validate) + for entry in figure['data']: for key, val in list(entry.items()): try: diff --git a/plotly/tools.py b/plotly/tools.py index 85ea9644cec..fa5c6898598 100644 --- a/plotly/tools.py +++ b/plotly/tools.py @@ -1230,3 +1230,35 @@ def __init__(self, url, width, height): def _repr_html_(self): return self.embed_code + + +def return_figure_from_figure_or_data(figure_or_data, validate_figure): + if isinstance(figure_or_data, dict): + figure = figure_or_data + elif isinstance(figure_or_data, list): + figure = {'data': figure_or_data} + else: + raise exceptions.PlotlyError("The `figure_or_data` positional " + "argument must be either " + "`dict`-like or `list`-like.") + if validate_figure: + try: + validate(figure, obj_type='Figure') + except exceptions.PlotlyError as err: + raise exceptions.PlotlyError("Invalid 'figure_or_data' argument. " + "Plotly will not be able to properly " + "parse the resulting JSON. If you " + "want to send this 'figure_or_data' " + "to Plotly anyway (not recommended), " + "you can set 'validate=False' as a " + "plot option.\nHere's why you're " + "seeing this error:\n\n{0}" + "".format(err)) + if not figure['data']: + raise exceptions.PlotlyEmptyDataError( + "Empty data list found. Make sure that you populated the " + "list of data objects you're sending and try again.\n" + "Questions? support@plot.ly" + ) + + return figure diff --git a/plotly/version.py b/plotly/version.py index 008e8016fb1..12ccbec34c4 100644 --- a/plotly/version.py +++ b/plotly/version.py @@ -1 +1 @@ -__version__ = '1.6.6' +__version__ = '1.6.7' diff --git a/plotly/widgets/graph_widget.py b/plotly/widgets/graph_widget.py index 1f7666138ac..22c5c28434f 100644 --- a/plotly/widgets/graph_widget.py +++ b/plotly/widgets/graph_widget.py @@ -1,6 +1,5 @@ from collections import deque import json -import os import uuid # TODO: protected imports? @@ -8,7 +7,8 @@ from IPython.utils.traitlets import Unicode from IPython.display import Javascript, display -from plotly import utils +from plotly import utils, tools +from plotly.graph_objs import Figure from pkg_resources import resource_string # Load JS widget code @@ -247,6 +247,61 @@ def message_handler(widget, ranges): """ self._handle_registration('zoom', callback, remove) + def plot(self, figure_or_data, validate=True): + """Plot figure_or_data in the Plotly graph widget. + + Args: + figure_or_data (dict, list, or plotly.graph_obj object): + The standard Plotly graph object that describes Plotly + graphs as used in `plotly.plotly.plot`. See examples + of the figure_or_data in https://plot.ly/python/ + + Returns: None + + Example 1 - Graph a scatter plot: + ``` + from plotly.graph_objs import Scatter + g = GraphWidget() + g.plot([Scatter(x=[1, 2, 3], y=[10, 15, 13])]) + ``` + + Example 2 - Graph a scatter plot with a title: + ``` + from plotly.graph_objs import Scatter, Figure, Data + fig = Figure( + data = Data([ + Scatter(x=[1, 2, 3], y=[20, 15, 13]) + ]), + layout = Layout(title='Experimental Data') + ) + + g = GraphWidget() + g.plot(fig) + ``` + + Example 3 - Clear a graph widget + ``` + from plotly.graph_objs import Scatter, Figure + g = GraphWidget() + g.plot([Scatter(x=[1, 2, 3], y=[10, 15, 13])]) + + # Now clear it + g.plot({}) # alternatively, g.plot(Figure()) + ``` + """ + if figure_or_data == {} or figure_or_data == Figure(): + validate = False + + figure = tools.return_figure_from_figure_or_data(figure_or_data, + validate) + message = { + 'task': 'newPlot', + 'data': figure.get('data', []), + 'layout': figure.get('layout', {}), + 'graphId': self._graphId + } + self._handle_outgoing_message(message) + def restyle(self, data, indices=None): """Update the style of existing traces in the Plotly graph.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: