Files
dash-api/lib/python3.11/site-packages/plotly/io/_utils.py
2025-09-07 22:09:54 +02:00

94 lines
2.8 KiB
Python

from typing import List
import plotly
import plotly.graph_objs as go
from plotly.offline import get_plotlyjs_version
def validate_coerce_fig_to_dict(fig, validate):
from plotly.basedatatypes import BaseFigure
if isinstance(fig, BaseFigure):
fig_dict = fig.to_dict()
elif isinstance(fig, dict):
if validate:
# This will raise an exception if fig is not a valid plotly figure
fig_dict = plotly.graph_objs.Figure(fig).to_plotly_json()
else:
fig_dict = fig
elif hasattr(fig, "to_plotly_json"):
fig_dict = fig.to_plotly_json()
else:
raise ValueError(
"""
The fig parameter must be a dict or Figure.
Received value of type {typ}: {v}""".format(typ=type(fig), v=fig)
)
return fig_dict
def validate_coerce_output_type(output_type):
if output_type == "Figure" or output_type == go.Figure:
cls = go.Figure
elif output_type == "FigureWidget" or (
hasattr(go, "FigureWidget") and output_type == go.FigureWidget
):
cls = go.FigureWidget
else:
raise ValueError(
"""
Invalid output type: {output_type}
Must be one of: 'Figure', 'FigureWidget'"""
)
return cls
def broadcast_args_to_dicts(**kwargs: dict) -> List[dict]:
"""
Given one or more keyword arguments which may be either a single value or a list of values,
return a list of keyword dictionaries by broadcasting the single valuesacross all the dicts.
If more than one item in the input is a list, all lists must be the same length.
Parameters
----------
**kwargs: dict
The keyword arguments
Returns
-------
list of dicts
A list of dictionaries
Raises
------
ValueError
If any of the input lists are not the same length
"""
# Check that all list arguments have the same length,
# and find out what that length is
# If there are no list arguments, length is 1
list_lengths = [len(v) for v in tuple(kwargs.values()) if isinstance(v, list)]
if list_lengths and len(set(list_lengths)) > 1:
raise ValueError("All list arguments must have the same length.")
list_length = list_lengths[0] if list_lengths else 1
# Expand all arguments to lists of the same length
expanded_kwargs = {
k: [v] * list_length if not isinstance(v, list) else v
for k, v in kwargs.items()
}
# Reshape into a list of dictionaries
# Each dictionary represents the keyword arguments for a single function call
list_of_kwargs = [
{k: v[i] for k, v in expanded_kwargs.items()} for i in range(list_length)
]
return list_of_kwargs
def plotly_cdn_url(cdn_ver=get_plotlyjs_version()):
"""Return a valid plotly CDN url."""
return "https://cdn.plot.ly/plotly-{cdn_ver}.min.js".format(
cdn_ver=cdn_ver,
)