Skip to content

Commit 1832a97

Browse files
committed
feat: add color cycle selection
1 parent befffe1 commit 1832a97

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

pydelmod/dvue/tsdataui.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from .dataui import DataUIManager, full_stack
22
from datetime import datetime, timedelta
33
import warnings
4+
from functools import lru_cache
5+
46

57
warnings.filterwarnings("ignore")
68

@@ -14,13 +16,19 @@
1416
import param
1517
import panel as pn
1618
import colorcet as cc
19+
from holoviews.plotting.util import process_cmap
1720

1821
pn.extension("tabulator", notifications=True, design="native")
1922
#
2023
LINE_DASH_MAP = ["solid", "dashed", "dotted", "dotdash", "dashdot"]
2124
from vtools.functions.filter import cosine_lanczos
2225

2326

27+
def unique_preserve_order(seq):
28+
seen = set()
29+
return [x for x in seq if not (x in seen or seen.add(x))]
30+
31+
2432
def get_color_dataframe(stations, color_cycle=hv.Cycle()):
2533
"""
2634
Create a dataframe with station names and colors
@@ -41,6 +49,15 @@ def get_colors(stations, dfc):
4149
return hv.Cycle(list(dfc.loc[stations].values.flatten()))
4250

4351

52+
@lru_cache
53+
def get_categorical_color_maps():
54+
cmaps = hv.plotting.util.list_cmaps(
55+
records=True, category="Categorical", reverse=False
56+
)
57+
cmaps = {c.name + "." + c.provider: c for c in cmaps}
58+
return cmaps
59+
60+
4461
class TimeSeriesDataUIManager(DataUIManager):
4562
time_range = param.CalendarDateRange(
4663
default=None,
@@ -74,13 +91,18 @@ class TimeSeriesDataUIManager(DataUIManager):
7491
default=(0.01, 0.99), bounds=(0, 1), step=0.01, doc="Percentile range"
7592
)
7693
file_number_column_name = param.String(default="FILE_NUM")
94+
color_cycle_name = param.Selector(
95+
objects=list(get_categorical_color_maps().keys()),
96+
default="glasbey_dark.colorcet",
97+
doc="Color cycle name",
98+
)
7799

78100
def __init__(
79101
self, filename_column="FILE", file_number_column_name="FILE_NUM", **params
80102
):
81-
self.color_cycle = hv.Cycle(cc.glasbey_dark)
82103
# modify catalog if filename_column is present to include file number if multiple files are present
83104
catalog = self.get_data_catalog()
105+
self.change_color_cycle()
84106
self.filename_column = filename_column
85107
self.file_number_column_name = file_number_column_name
86108
self.display_fileno = False
@@ -135,6 +157,14 @@ def get_name_to_marker(self):
135157

136158
return list(MarkerType)
137159

160+
@param.depends("color_cycle_name", watch=True)
161+
def change_color_cycle(self):
162+
cmapinfo = get_categorical_color_maps()[self.color_cycle_name]
163+
color_list = unique_preserve_order(
164+
process_cmap(cmapinfo.name, provider=cmapinfo.provider)
165+
)
166+
self.color_cycle = hv.Cycle(color_list)
167+
138168
def get_widgets(self):
139169
control_widgets = pn.Column(
140170
pn.pane.HTML("Change time range of data to display:"),
@@ -158,6 +188,7 @@ def get_widgets(self):
158188
),
159189
self.param.irregular_curve_connection,
160190
self.param.regular_curve_connection,
191+
self.param.color_cycle_name,
161192
)
162193

163194
return control_widgets

0 commit comments

Comments
 (0)