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 warnings
from io import BytesIO
import plotly.graph_objects as go
import webbrowser
from pathlib import Path
[docs]def render_plotly_figure_as_image_file(
figure: go.Figure,
format: str = "png",
width: int = 512,
height: int = 512,
) -> bytes:
""""Render Plotly figure as a static PNG image.
See
- https://plotly.com/python/static-image-export/
- https://plotly.github.io/plotly.py-docs/generated/plotly.io.write_image.html
:param format:
"png" or "svg"
"""
assert format in ["png", "svg"], "Format must be png or svg"
stream = BytesIO()
with warnings.catch_warnings():
# /Users/moo/Library/Caches/pypoetry/virtualenvs/trade-executor-kk5ZLC7w-py3.11/lib/python3.11/site-packages/kaleido/scopes/base.py:188: DeprecationWarning:
#
# setDaemon() is deprecated, set the daemon attribute instead
warnings.simplefilter("ignore")
figure.write_image(
stream,
format=format,
engine="kaleido",
width=width,
height=height,
)
data = stream.getvalue()
stream.close()
return data
[docs]def open_plotly_figure_in_browser(figure: go.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()}")