Parallel coordinates

BinderScriptNotebook

Summary: This example shows how to create parallel coordinates plot in F#.

let's first create some data for the purpose of creating example charts:

open Plotly.NET 

let data = 
    [
        "A",[1.;4.;3.4;0.7;]
        "B",[3.;1.5;1.7;2.3;]
        "C",[2.;4.;3.1;5.]
        "D",[4.;2.;2.;4.;]
    ]

Parallel coordinates are a common way of visualizing high-dimensional geometry and analyzing multivariate data. To show a set of points in an n-dimensional space, a backdrop is drawn consisting of n parallel lines, typically vertical and equally spaced. A point in n-dimensional space is represented as a polyline with vertices on the parallel axes; the position of the vertex on the i-th axis corresponds to the i-th coordinate of the point.

let parcoords1 =
    Chart.ParallelCoord(data,LineColor=Color.fromString "blue", UseDefaults = false)

More styled example

This example shows the usage of some of the styling possibility using Chart.ParallelCoord. For even more styling control, use the respective TraceStyle function TraceDomainStyle.ParallelCoord

open Plotly.NET.TraceObjects

#r "nuget: FSharp.Data"
#r "nuget: Deedle"

open FSharp.Data
open Deedle

let parcoordsStyled =

    let data =
        "https://raw.githubusercontent.com/bcdunbar/datasets/master/iris.csv"
        |> Http.RequestString
        |> Frame.ReadCsvString

    let dims = 
        [
            Dimension.initParallel(Label = "sepal_length", Values = (data |> Frame.getCol "sepal_length" |> Series.values), Range = StyleParam.Range.MinMax(0., 8.))
            Dimension.initParallel(Label = "sepal_width" , Values = (data |> Frame.getCol "sepal_width"  |> Series.values), Range = StyleParam.Range.MinMax(0., 8.))
            Dimension.initParallel(Label = "petal_length", Values = (data |> Frame.getCol "petal_length" |> Series.values), Range = StyleParam.Range.MinMax(0., 8.))
            Dimension.initParallel(Label = "petal_width" , Values = (data |> Frame.getCol "petal_width"  |> Series.values), Range = StyleParam.Range.MinMax(0., 8.))
        ]

    let colors = 
        data
        |> Frame.getCol "species_id"
        |> Series.values
        |> Color.fromColorScaleValues

    Chart.ParallelCoord(
        dims,
        LineColorScale = StyleParam.Colorscale.Viridis,
        LineColor = colors
    )
namespace Plotly
namespace Plotly.NET
val data: (string * float list) list
val parcoords1: GenericChart.GenericChart
type Chart = static member AnnotatedHeatmap: zData: seq<#seq<'a1>> * annotationText: seq<#seq<string>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?X: seq<#IConvertible> * ?XGap: int * ?Y: seq<#IConvertible> * ?YGap: int * ?Text: 'a5 * ?MultiText: seq<'a5> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?ZSmooth: SmoothAlg * ?Transpose: bool * ?UseWebGL: bool * ?ReverseYAxis: bool * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a5 :> IConvertible) + 1 overload static member Area: x: seq<#IConvertible> * y: seq<#IConvertible> * ?ShowMarkers: bool * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?FillColor: Color * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Bar: values: seq<#IConvertible> * ?Keys: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerPatternShape: PatternShape * ?MultiMarkerPatternShape: seq<PatternShape> * ?MarkerPattern: Pattern * ?Marker: Marker * ?Base: #IConvertible * ?Width: 'a4 * ?MultiWidth: seq<'a4> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member BoxPlot: ?X: seq<#IConvertible> * ?Y: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Text: 'a2 * ?MultiText: seq<'a2> * ?FillColor: Color * ?MarkerColor: Color * ?Marker: Marker * ?Opacity: float * ?WhiskerWidth: float * ?BoxPoints: BoxPoints * ?BoxMean: BoxMean * ?Jitter: float * ?PointPos: float * ?Orientation: Orientation * ?OutlineColor: Color * ?OutlineWidth: float * ?Outline: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?Notched: bool * ?NotchWidth: float * ?QuartileMethod: QuartileMethod * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) + 2 overloads static member Bubble: x: seq<#IConvertible> * y: seq<#IConvertible> * sizes: seq<int> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Candlestick: ``open`` : seq<#IConvertible> * high: seq<#IConvertible> * low: seq<#IConvertible> * close: seq<#IConvertible> * x: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Text: 'a5 * ?MultiText: seq<'a5> * ?Line: Line * ?IncreasingColor: Color * ?Increasing: FinanceMarker * ?DecreasingColor: Color * ?Decreasing: FinanceMarker * ?WhiskerWidth: float * ?UseDefaults: bool -> GenericChart (requires 'a5 :> IConvertible) + 1 overload static member Column: values: seq<#IConvertible> * ?Keys: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerPatternShape: PatternShape * ?MultiMarkerPatternShape: seq<PatternShape> * ?MarkerPattern: Pattern * ?Marker: Marker * ?Base: #IConvertible * ?Width: 'a4 * ?MultiWidth: seq<'a4> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member Contour: zData: seq<#seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?X: seq<#IConvertible> * ?Y: seq<#IConvertible> * ?Text: 'a4 * ?MultiText: seq<'a4> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?Transpose: bool * ?ContourLineColor: Color * ?ContourLineDash: DrawingStyle * ?ContourLineSmoothing: float * ?ContourLine: Line * ?ContoursColoring: ContourColoring * ?ContoursOperation: ConstraintOperation * ?ContoursType: ContourType * ?ShowContourLabels: bool * ?ContourLabelFont: Font * ?Contours: Contours * ?FillColor: Color * ?NContours: int * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a4 :> IConvertible) static member Funnel: x: seq<#IConvertible> * y: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Width: float * ?Offset: float * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?Orientation: Orientation * ?AlignmentGroup: string * ?OffsetGroup: string * ?MarkerColor: Color * ?MarkerOutline: Line * ?Marker: Marker * ?TextInfo: TextInfo * ?ConnectorLineColor: Color * ?ConnectorLineStyle: DrawingStyle * ?ConnectorFillColor: Color * ?ConnectorLine: Line * ?Connector: FunnelConnector * ?InsideTextFont: Font * ?OutsideTextFont: Font * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) static member Heatmap: zData: seq<#seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?X: seq<#IConvertible> * ?XGap: int * ?Y: seq<#IConvertible> * ?YGap: int * ?Text: 'a4 * ?MultiText: seq<'a4> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?ZSmooth: SmoothAlg * ?Transpose: bool * ?UseWebGL: bool * ?ReverseYAxis: bool * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a4 :> IConvertible) + 1 overload ...
static member Chart.ParallelCoord: keyValues: seq<string * #seq<'b>> * ?Name: string * ?LineColor: Color * ?LineColorScale: StyleParam.Colorscale * ?ShowLineColorScale: bool * ?ReverseLineColorScale: bool * ?Line: Line * ?LabelAngle: int * ?LabelFont: Font * ?LabelSide: StyleParam.Side * ?RangeFont: Font * ?TickFont: Font * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'b :> System.IConvertible)
static member Chart.ParallelCoord: dimensions: seq<TraceObjects.Dimension> * ?Name: string * ?LineColor: Color * ?LineColorScale: StyleParam.Colorscale * ?ShowLineColorScale: bool * ?ReverseLineColorScale: bool * ?Line: Line * ?LabelAngle: int * ?LabelFont: Font * ?LabelSide: StyleParam.Side * ?RangeFont: Font * ?TickFont: Font * ?UseDefaults: bool -> GenericChart.GenericChart
type Color = override Equals: other: obj -> bool override GetHashCode: unit -> int static member fromARGB: a: int -> r: int -> g: int -> b: int -> Color static member fromColorScaleValues: c: seq<#IConvertible> -> Color static member fromColors: c: seq<Color> -> Color static member fromHex: s: string -> Color static member fromKeyword: c: ColorKeyword -> Color static member fromRGB: r: int -> g: int -> b: int -> Color static member fromString: c: string -> Color member Value: obj
<summary> Plotly color can be a single color, a sequence of colors, or a sequence of numeric values referencing the color of the colorscale obj </summary>
static member Color.fromString: c: string -> Color
module GenericChart from Plotly.NET
<summary> Module to represent a GenericChart </summary>
val toChartHTML: gChart: GenericChart.GenericChart -> string
<summary> Converts a GenericChart to it HTML representation. The div layer has a default size of 600 if not specified otherwise. </summary>
namespace Plotly.NET.TraceObjects
Multiple items
namespace FSharp

--------------------
namespace Microsoft.FSharp
Multiple items
namespace FSharp.Data

--------------------
namespace Microsoft.FSharp.Data
namespace Deedle
val parcoordsStyled: GenericChart.GenericChart
val data: Frame<int,string>
type Http = static member AsyncRequest: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> Async<HttpResponse> static member AsyncRequestStream: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> Async<HttpResponseWithStream> static member AsyncRequestString: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> Async<string> static member Request: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> HttpResponse static member RequestStream: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> HttpResponseWithStream static member RequestString: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (HttpWebRequest -> HttpWebRequest) * ?timeout: int -> string
<summary> Utilities for working with network via HTTP. Includes methods for downloading resources with specified headers, query parameters and HTTP body </summary>
Multiple items
static member Http.RequestString: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: System.Net.CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (System.Net.HttpWebRequest -> System.Net.HttpWebRequest) * ?timeout: int -> string

--------------------
static member Http.RequestString: url: string * ?query: (string * string) list * ?headers: seq<string * string> * ?httpMethod: string * ?body: HttpRequestBody * ?cookies: seq<string * string> * ?cookieContainer: System.Net.CookieContainer * ?silentHttpErrors: bool * ?silentCookieErrors: bool * ?responseEncodingOverride: string * ?customizeHttpRequest: (System.Net.HttpWebRequest -> System.Net.HttpWebRequest) * ?timeout: int -> string
Multiple items
module Frame from Deedle

--------------------
type Frame = static member ReadCsv: location: string * hasHeaders: Nullable<bool> * inferTypes: Nullable<bool> * inferRows: Nullable<int> * schema: string * separators: string * culture: string * maxRows: Nullable<int> * missingValues: string[] * preferOptions: bool -> Frame<int,string> + 1 overload static member ReadReader: reader: IDataReader -> Frame<int,string> static member CustomExpanders: Dictionary<Type,Func<obj,seq<string * Type * obj>>> static member NonExpandableInterfaces: ResizeArray<Type> static member NonExpandableTypes: HashSet<Type>

--------------------
type Frame<'TRowKey,'TColumnKey (requires equality and equality)> = interface IDynamicMetaObjectProvider interface INotifyCollectionChanged interface IFsiFormattable interface IFrame new: rowIndex: IIndex<'TRowKey> * columnIndex: IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: IIndexBuilder * vectorBuilder: IVectorBuilder -> Frame<'TRowKey,'TColumnKey> + 1 overload member AddColumn: column: 'TColumnKey * series: seq<'V> -> unit + 3 overloads member AggregateRowsBy: groupBy: seq<'TColumnKey> * aggBy: seq<'TColumnKey> * aggFunc: Func<Series<'TRowKey,'a>,'b> -> Frame<int,'TColumnKey> member Clone: unit -> Frame<'TRowKey,'TColumnKey> member ColumnApply: f: Func<Series<'TRowKey,'T>,ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey> + 1 overload member DropColumn: column: 'TColumnKey -> unit ...

--------------------
new: names: seq<'TColumnKey> * columns: seq<ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey>
new: rowIndex: Indices.IIndex<'TRowKey> * columnIndex: Indices.IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: Indices.IIndexBuilder * vectorBuilder: Vectors.IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
static member Frame.ReadCsvString: csvString: string * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string[] * ?preferOptions: bool -> Frame<int,string>
val dims: Dimension list
Multiple items
type Dimension = inherit DynamicObj new: unit -> Dimension static member initParallel: ?ConstraintRange: Range * ?Label: #IConvertible * ?MultiSelect: bool * ?Name: string * ?Range: Range * ?TemplateItemName: string * ?TickFormat: TickMode * ?TickText: seq<#IConvertible> * ?Tickvals: seq<#IConvertible> * ?Values: seq<#IConvertible> * ?Visible: bool -> Dimension static member initSplom: ?AxisMatches: bool * ?AxisType: AxisType * ?Label: #IConvertible * ?Name: string * ?TemplateItemName: string * ?Values: seq<#IConvertible> * ?Visible: bool -> Dimension static member style: ?Label: #IConvertible * ?Name: string * ?TemplateItemName: string * ?Values: seq<#IConvertible> * ?Visible: bool * ?ConstraintRange: Range * ?MultiSelect: bool * ?Range: Range * ?TickFormat: TickMode * ?TickText: seq<#IConvertible> * ?Tickvals: seq<#IConvertible> * ?AxisMatches: bool * ?AxisType: AxisType -> (Dimension -> Dimension)
<summary> Dimensions type inherits from dynamic object </summary>

--------------------
new: unit -> Dimension
static member Dimension.initParallel: ?ConstraintRange: StyleParam.Range * ?Label: #System.IConvertible * ?MultiSelect: bool * ?Name: string * ?Range: StyleParam.Range * ?TemplateItemName: string * ?TickFormat: StyleParam.TickMode * ?TickText: seq<#System.IConvertible> * ?Tickvals: seq<#System.IConvertible> * ?Values: seq<#System.IConvertible> * ?Visible: bool -> Dimension
val getCol: column: 'C -> frame: Frame<'R,'C> -> Series<'R,'V> (requires equality and equality)
Multiple items
module Series from Deedle

--------------------
type Series = static member ofNullables: values: seq<Nullable<'a0>> -> Series<int,'a0> (requires default constructor and value type and 'a0 :> ValueType) static member ofObservations: observations: seq<'c * 'd> -> Series<'c,'d> (requires equality) static member ofOptionalObservations: observations: seq<'K * 'a1 option> -> Series<'K,'a1> (requires equality) static member ofValues: values: seq<'a> -> Series<int,'a>

--------------------
type Series<'K,'V (requires equality)> = interface IFsiFormattable interface ISeries<'K> new: index: IIndex<'K> * vector: IVector<'V> * vectorBuilder: IVectorBuilder * indexBuilder: IIndexBuilder -> Series<'K,'V> + 3 overloads member After: lowerExclusive: 'K -> Series<'K,'V> member Aggregate: aggregation: Aggregation<'K> * keySelector: Func<DataSegment<Series<'K,'V>>,'TNewKey> * valueSelector: Func<DataSegment<Series<'K,'V>>,OptionalValue<'R>> -> Series<'TNewKey,'R> (requires equality) + 1 overload member AsyncMaterialize: unit -> Async<Series<'K,'V>> member Before: upperExclusive: 'K -> Series<'K,'V> member Between: lowerInclusive: 'K * upperInclusive: 'K -> Series<'K,'V> member Compare: another: Series<'K,'V> -> Series<'K,Diff<'V>> member Convert: forward: Func<'V,'R> * backward: Func<'R,'V> -> Series<'K,'R> ...

--------------------
new: pairs: seq<System.Collections.Generic.KeyValuePair<'K,'V>> -> Series<'K,'V>
new: keys: seq<'K> * values: seq<'V> -> Series<'K,'V>
new: keys: 'K[] * values: 'V[] -> Series<'K,'V>
new: index: Indices.IIndex<'K> * vector: IVector<'V> * vectorBuilder: Vectors.IVectorBuilder * indexBuilder: Indices.IIndexBuilder -> Series<'K,'V>
val values: series: Series<'K,'T> -> seq<'T> (requires equality)
module StyleParam from Plotly.NET
type Range = | MinMax of IConvertible * IConvertible | Values of IConvertible array member Convert: unit -> obj static member ofMinMax: min: #IConvertible * max: #IConvertible -> Range static member ofValues: values: seq<#IConvertible> -> Range static member convert: (Range -> obj)
<summary> Defines a Range between min and max value </summary>
union case StyleParam.Range.MinMax: System.IConvertible * System.IConvertible -> StyleParam.Range
val colors: Color
static member Color.fromColorScaleValues: c: seq<#System.IConvertible> -> Color
static member Chart.ParallelCoord: keyValues: seq<string * #seq<'b>> * ?Name: string * ?LineColor: Color * ?LineColorScale: StyleParam.Colorscale * ?ShowLineColorScale: bool * ?ReverseLineColorScale: bool * ?Line: Line * ?LabelAngle: int * ?LabelFont: Font * ?LabelSide: StyleParam.Side * ?RangeFont: Font * ?TickFont: Font * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'b :> System.IConvertible)
static member Chart.ParallelCoord: dimensions: seq<Dimension> * ?Name: string * ?LineColor: Color * ?LineColorScale: StyleParam.Colorscale * ?ShowLineColorScale: bool * ?ReverseLineColorScale: bool * ?Line: Line * ?LabelAngle: int * ?LabelFont: Font * ?LabelSide: StyleParam.Side * ?RangeFont: Font * ?TickFont: Font * ?UseDefaults: bool -> GenericChart.GenericChart
type Colorscale = | Custom of seq<float * Color> | RdBu | Earth | Blackbody | YIOrRd | YIGnBu | Bluered | Portland | Electric | Jet ... member Convert: unit -> obj static member convert: (Colorscale -> obj)
<summary> The colorscale must be a collection containing a mapping of a normalized value (between 0.0 and 1.0) to it's color. At minimum, a mapping for the lowest (0.0) and highest (1.0) values are required. </summary>
union case StyleParam.Colorscale.Viridis: StyleParam.Colorscale