@@ -24,7 +24,7 @@ Convert `values` to Colors.jl colors based on given options.
2424"""
2525function colorfy (values; alpha= 1.0 , colorscheme= :viridis , colorrange= :extrema )
2626 # handle input arguments
27- vs, αs, s, r = handleargs (values, alpha, colorscheme, colorrange)
27+ vs, αs, cm, cr = handleargs (values, alpha, colorscheme, colorrange)
2828
2929 # find invalid and valid indices
3030 iinds = findall (isinvalid, vs)
@@ -34,7 +34,7 @@ function colorfy(values; alpha=1.0, colorscheme=:viridis, colorrange=:extrema)
3434 isempty (vinds) && return fill (colorant " transparent" , length (values))
3535
3636 # construct colors for valid values
37- rcolors = repr (nonmissingvec (vs[vinds]), s, r )
37+ rcolors = repr (nonmissingvec (vs[vinds]), cm, cr )
3838 ralphas = map (Colors. alpha, rcolors)
3939 vcolors = coloralpha .(rcolors, αs[vinds] .* ralphas)
4040
4949function handleargs (values, alphas, colorscheme, colorrange)
5050 vs = asvalues (values)
5151 αs = asalphas (alphas, vs)
52- s = ascolorscheme (colorscheme)
53- r = ascolorrange (colorrange)
54- vs, αs, s, r
52+ cm = ascolormap (colorscheme, vs )
53+ cr = ascolorrange (colorrange)
54+ vs, αs, cm, cr
5555end
5656
5757asvalues (values) = values
@@ -68,6 +68,12 @@ function asalphas(alphas::AbstractVector, values)
6868 alphas
6969end
7070
71+ function ascolormap (colorscheme, values)
72+ nl = nlevels (values)
73+ cs = ascolorscheme (colorscheme)
74+ isfinite (nl) ? discretescheme (cs, nl) : cs
75+ end
76+
7177ascolorscheme (colorscheme:: Symbol ) = colorschemes[colorscheme]
7278ascolorscheme (colorscheme:: AbstractString ) = ascolorscheme (Symbol (colorscheme))
7379ascolorscheme (colorscheme:: AbstractVector ) = ColorScheme ([parse (Colorant, color) for color in colorscheme])
@@ -79,42 +85,16 @@ function ascolorrange(colorrange::NTuple{2,Number})
7985 Tuple (nominal (collect (crange)))
8086end
8187
82- """
83- nominal(values)
84-
85- Nominal representation of `values` for color mapping.
86- This function is used to convert non-numeric values to
87- numeric values that can be used in ticks and color bars.
88- """
89- function nominal (values)
90- # find invalid and valid indices
91- iinds = findall (isinvalid, values)
92- vinds = setdiff (1 : length (values), iinds)
93-
94- # if all values are invalid, return missing values
95- isempty (vinds) && return fill (missing , length (values))
96-
97- # construct nominal values for valid values
98- vvalues = nominal (nonmissingvec (values[vinds]))
99-
100- # construct nominal values for all values
101- if isempty (iinds) # all values are valid, return nominal values directly
102- vvalues
103- else # set missing value for invalid values
104- genvec (vinds, vvalues, iinds, missing )
105- end
106- end
107-
10888# ----------------
10989# IMPLEMENTATIONS
11090# ----------------
11191
11292"""
113- repr(values::AbstractVector{T}, colorscheme , colorrange)
93+ repr(values, colormap , colorrange)
11494
115- Colorful representation of `values` of type `T` based on `colorscheme ` and `colorrange`.
95+ Colorful representation of `values` based on `colormap ` and `colorrange`.
11696"""
117- function repr (values:: AbstractVector{T} , colorscheme , colorrange) where {T}
97+ function repr (values:: AbstractVector{T} , colormap , colorrange) where {T}
11898 throw (ArgumentError ("""
11999 values of type `$T ` do not have a colorful representation.
120100
@@ -123,30 +103,57 @@ function repr(values::AbstractVector{T}, colorscheme, colorrange) where {T}
123103 """ ))
124104end
125105
126- repr (values:: AbstractVector{<:Colorant} , colorscheme , colorrange) = values
106+ repr (values:: AbstractVector{<:Colorant} , colormap , colorrange) = values
127107
128- function repr (values:: AbstractVector{<:Number} , colorscheme , colorrange)
108+ function repr (values:: AbstractVector{<:Number} , colormap , colorrange)
129109 isna (v) = isnan (v) || isinf (v)
130110 if any (isna, values)
131111 iinds = findall (isna, values)
132112 vinds = setdiff (1 : length (values), iinds)
133113 vvals = nonmissingvec (values[vinds])
134- vcolor = get (colorscheme , vvals, colorrange)
114+ vcolor = get (colormap , vvals, colorrange)
135115 icolor = colorant " transparent"
136116 genvec (vinds, vcolor, iinds, icolor)
137117 else
138- get (colorscheme , values, colorrange)
118+ get (colormap , values, colorrange)
139119 end
140120end
141121
142- repr (values:: AbstractVector{<:Symbol} , colorscheme, colorrange) = repr (map (string, values), colorscheme, colorrange)
122+ repr (values:: AbstractVector{<:Symbol} , colormap, colorrange) = repr (map (string, values), colormap, colorrange)
123+
124+ repr (values:: AbstractVector{<:AbstractString} , colormap, colorrange) = map (v -> parse (Colorant, v), values)
143125
144- repr (values:: AbstractVector{<:AbstractString } , colorscheme , colorrange) = map (v -> parse (Colorant, v ), values )
126+ repr (values:: AbstractVector{<:Date } , colormap , colorrange) = repr ( map (DateTime, values ), colormap, colorrange )
145127
146- repr (values:: AbstractVector{<:Date} , colorscheme, colorrange) = repr (map (DateTime, values), colorscheme, colorrange)
128+ repr (values:: AbstractVector{<:DateTime} , colormap, colorrange) =
129+ repr (map (datetime2unix, values), colormap, colorrange)
147130
148- repr (values:: AbstractVector{<:DateTime} , colorscheme, colorrange) =
149- repr (map (datetime2unix, values), colorscheme, colorrange)
131+ """
132+ nominal(values)
133+
134+ Nominal representation of `values` for color mapping.
135+
136+ This function is used to convert non-numeric values to
137+ numeric values that can be used in ticks and color bars.
138+ """
139+ function nominal (values)
140+ # find invalid and valid indices
141+ iinds = findall (isinvalid, values)
142+ vinds = setdiff (1 : length (values), iinds)
143+
144+ # if all values are invalid, return missing values
145+ isempty (vinds) && return fill (missing , length (values))
146+
147+ # construct nominal values for valid values
148+ vvalues = nominal (nonmissingvec (values[vinds]))
149+
150+ # construct nominal values for all values
151+ if isempty (iinds) # all values are valid, return nominal values directly
152+ vvalues
153+ else # set missing value for invalid values
154+ genvec (vinds, vvalues, iinds, missing )
155+ end
156+ end
150157
151158function nominal (values:: AbstractVector{<:Number} )
152159 isna (v) = isnan (v) || isinf (v)
@@ -164,14 +171,28 @@ nominal(values::AbstractVector{<:Date}) = nominal(map(DateTime, values))
164171
165172nominal (values:: AbstractVector{<:DateTime} ) = map (datetime2unix, values)
166173
174+ """
175+ nlevels(values)
176+
177+ Number of levels in `values` for color mapping.
178+
179+ This function is used to determine the number of
180+ colors needed for categorical data. By default,
181+ it returns `Inf` to indicate that the number of
182+ levels is infinite (i.e., continuous data).
183+ """
184+ nlevels (values) = Inf
185+
167186# -----------------
168187# HELPER FUNCTIONS
169188# -----------------
170189
171- isinvalid (value) = ismissing (value) || (value isa Number && ! isfinite (value))
172-
173190fixcolors (colors) = convert .(floattype (eltype (colors)), colors)
174191
192+ discretescheme (colorscheme, n) = colorscheme # TODO
193+
194+ isinvalid (value) = ismissing (value) || (value isa Number && ! isfinite (value))
195+
175196nonmissingvec (values:: AbstractVector{T} ) where {T} = convert (AbstractVector{nonmissingtype (T)}, values)
176197
177198function genvec (vecinds, vec, valinds, val)
0 commit comments