"""Component for displaying a plotly graph.""" from typing import Dict, Union from plotly.graph_objects import Figure from plotly.io import to_json from pynecone.components.component import Component from pynecone.components.tags import Tag from pynecone.var import Var class PlotlyLib(Component): """A component that wraps a plotly lib.""" library = "react-plotly.js" class Plotly(PlotlyLib): """Display a plotly graph.""" tag = "Plot" # The figure to display. This can be a plotly figure or a plotly data json. data: Var[Figure] # The layout of the graph. layout: Var[Dict] # The width of the graph. width: Var[str] # The height of the graph. height: Var[str] def _get_imports(self): return {} def _get_custom_code(self) -> str: return """import dynamic from 'next/dynamic' const Plot = dynamic(() => import('react-plotly.js'), { ssr: false }); """ def _render(self) -> Tag: if isinstance(self.data, Figure): if self.layout is None: if self.width is not None: layout = Var.create({"width": self.width, "height": self.height}) assert layout is not None self.layout = layout return super()._render()