Source code for tradeexecutor.visual.image_output
"""Charts export to PNG.
- Render Plotly figures as static PNG images
- Used on a frontend for the performance charts, in Discord posts
"""
import logging
import webbrowser
from pathlib import Path
from plotly.graph_objects import Figure
logger = logging.getLogger(__name__)
[docs]def render_plotly_figure_as_image_file(
figure: Figure,
format: str = "png",
width: int = 512,
height: int = 512,
) -> bytes:
""""Render Plotly figure as a static PNG image.
- Uses Kaleido to render the Plotly figure as a PNG or SVG image
- Plotly's Figure.to_image uses Kaleido when it's installed/available
:param format:
See ``kaleido._fig_tools` module for supported formats.
Supporting only png and svg for now.
:param width:
Width in pixels
:param height:
Height in pixels
:return:
Image data encoded as byttes blob.
"""
assert format in ["png", "svg"], "Format must be png or svg"
assert isinstance(figure, Figure), "Figure must be an instance of plotly.graph_objects.Figure"
logger.info(f"render_plotly_figure_as_image_file(): {type(figure)} {width}x{height}")
data = figure.to_image(format, width, height)
assert len(data) > 0, "Rendered image data is empty"
logger.info("Plotly/Kaleido rendering done")
return data
[docs]def open_plotly_figure_in_browser(figure: Figure, height:int = 512, width: int = 512) -> None:
"""Open Plotly figure in a browser. Useful for debugging.
See https://stackoverflow.com/a/74619515/315168
:param figure:
Plotly figure
"""
png_data = render_plotly_figure_as_image_file(figure, height=height, width=width)
path = Path("/tmp/test-image.png")
with open(path, "wb") as out:
out.write(png_data)
webbrowser.open(f"file://{path.as_posix()}")
[docs]def open_bytes_in_browser(data: bytes, format="png") -> None:
"""Open bytes in a browser. Useful for debugging.
:param data:
bytes data to be used to create an image
"""
path = Path(f"/tmp/test-image.{format}")
with open(path, "wb") as out:
out.write(data)
webbrowser.open(f"file://{path.as_posix()}")