Source code for biomechzoo.ensembler.style_content
import plotly.colors as pc
[docs]
class StyleContext:
"""
Owns all color/dash assignments and legend deduplication state.
Shared across the entire figure built so assignments are consistent
"""
_SUBJECT_COLORS = pc.qualitative.D3
_CONDITION_COLORS = pc.qualitative.D3
_CONDITION_DASHES = ["solid", "dash", "dot", "dashdot"]
# _CONDITION_DASHES = ["solid"]
def __init__(self, subjects , conditions):
"""
Parameters
----------
subjects : list[str]
conditions : list[str]
"""
conditions = conditions or []
self._subj_color = {
s: self._SUBJECT_COLORS[i % len(self._SUBJECT_COLORS)] for i, s in enumerate(subjects)
}
self._cond_color = {
c : self._CONDITION_COLORS[i % len(self._CONDITION_COLORS)] for i, c in enumerate(conditions)
}
self._cond_dash = {
c: self._CONDITION_DASHES[i % len(self._CONDITION_DASHES)] for i, c in enumerate(conditions)
}
self._legend_seen: set[str] = set()
[docs]
def subject_color(self, subject : str): return self._subj_color.get(subject, "#333")
[docs]
def condition_color(self, condition: str) -> str: return self._cond_color.get(condition, "#333")
[docs]
def condition_dash(self, condition: str) -> str: return self._cond_dash.get(condition, "solid")
[docs]
def should_show_legend(self, namespace, key):
"""Returns True the first time (namespace, key) is seen,then False"""
token = f"{namespace}::{key}"
if token in self._legend_seen:
return False
self._legend_seen.add(token)
return True