Skip to content

Commit 7b6a594

Browse files
committed
Adds function to sample colorscales
1 parent 03979d1 commit 7b6a594

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

packages/python/plotly/_plotly_utils/colors/__init__.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,3 +806,54 @@ def named_colorscales():
806806
from _plotly_utils.basevalidators import ColorscaleValidator
807807

808808
return [c for c in ColorscaleValidator("", "").named_colorscales]
809+
810+
811+
def sample_colorscale(colorscale, samplepoints, low=0.0, high=1.0, colortype="rgb"):
812+
"""
813+
Samples a colorscale at specific points.
814+
815+
Interpolates between colors in a colorscale to find the specific colors
816+
corresponding to the specified sample values. The colorscale can be specified
817+
as a list of `[scale, color]` pairs, as a list of colors, or as a named
818+
plotly colorscale. The samplepoints can be specefies an iterable of specific
819+
points in the range [0.0, 1.0], or as an integer number of points which will
820+
be spaced equally between the low value (default 0.0) and the high value
821+
(default 1.0). The output is a list of colors, formatted according to the
822+
specified colortype.
823+
"""
824+
from bisect import bisect_left
825+
826+
try:
827+
validate_colorscale(colorscale)
828+
except exceptions.PlotlyError:
829+
if isinstance(colorscale, str):
830+
if colorscale in PLOTLY_SCALES:
831+
colorscale = PLOTLY_SCALES[colorscale]
832+
else:
833+
raise exceptions.PlotlyError(
834+
"If your colors variable is a string, it must be a "
835+
"Plotly scale, an rgb color or a hex color."
836+
)
837+
else:
838+
colorscale = make_colorscale(colorscale)
839+
840+
scale = colorscale_to_scale(colorscale)
841+
validate_scale_values(scale)
842+
colors = colorscale_to_colors(colorscale)
843+
colors = validate_colors(colors, colortype="tuple")
844+
845+
if isinstance(samplepoints, int):
846+
samplepoints = [
847+
low + idx / (samplepoints - 1) * (high - low) for idx in range(samplepoints)
848+
]
849+
elif isinstance(samplepoints, float):
850+
samplepoints = [samplepoints]
851+
852+
sampled_colors = []
853+
for point in samplepoints:
854+
high = bisect_left(scale, point)
855+
low = high - 1
856+
interpolant = (point - scale[low]) / (scale[high] - scale[low])
857+
sampled_color = find_intermediate_color(colors[low], colors[high], interpolant)
858+
sampled_colors.append(sampled_color)
859+
return validate_colors(sampled_colors, colortype=colortype)

packages/python/plotly/plotly/colors/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"label_rgb",
3737
"make_colorscale",
3838
"n_colors",
39+
"sample_colorscale",
3940
"unconvert_from_RGB_255",
4041
"unlabel_rgb",
4142
"validate_colors",

0 commit comments

Comments
 (0)