Skip to content

Commit a175488

Browse files
committed
Finish splom chart
1 parent 7ce846f commit a175488

File tree

10 files changed

+372
-162
lines changed

10 files changed

+372
-162
lines changed

src/Plotly.NET/ChartAPI/Chart2D.fs

Lines changed: 84 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2701,63 +2701,106 @@ module Chart2D =
27012701
?UseDefaults = UseDefaults
27022702
)
27032703

2704-
2705-
2706-
/// Computes the parallel coordinates plot
2704+
/// Computes a scatter plot matrix (SPLOM)
27072705
[<Extension>]
27082706
static member Splom
27092707
(
2710-
dims:seq<'key*#seq<'values>>,
2711-
[<Optional;DefaultParameterValue(null)>] ?Range,
2712-
[<Optional;DefaultParameterValue(null)>] ?Constraintrange,
2713-
[<Optional;DefaultParameterValue(null)>] ?Color,
2714-
[<Optional;DefaultParameterValue(null)>] ?Colorscale,
2715-
[<Optional;DefaultParameterValue(null)>] ?Width,
2716-
[<Optional;DefaultParameterValue(null)>] ?Dash,
2717-
[<Optional;DefaultParameterValue(null)>] ?Domain,
2718-
[<Optional;DefaultParameterValue(null)>] ?Labelfont,
2719-
[<Optional;DefaultParameterValue(null)>] ?Tickfont,
2720-
[<Optional;DefaultParameterValue(null)>] ?Rangefont,
2721-
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
2708+
dimensions: seq<Dimension>,
2709+
[<Optional;DefaultParameterValue(null)>] ?Name : string,
2710+
[<Optional;DefaultParameterValue(null)>] ?ShowLegend : bool,
2711+
[<Optional;DefaultParameterValue(null)>] ?Opacity : float,
2712+
[<Optional;DefaultParameterValue(null)>] ?Text : #IConvertible,
2713+
[<Optional;DefaultParameterValue(null)>] ?MultiText : seq<#IConvertible>,
2714+
[<Optional;DefaultParameterValue(null)>] ?MarkerColor : Color,
2715+
[<Optional;DefaultParameterValue(null)>] ?MarkerColorScale : StyleParam.Colorscale,
2716+
[<Optional;DefaultParameterValue(null)>] ?MarkerOutline : Line,
2717+
[<Optional;DefaultParameterValue(null)>] ?MarkerSymbol : StyleParam.MarkerSymbol,
2718+
[<Optional;DefaultParameterValue(null)>] ?MultiMarkerSymbol : seq<StyleParam.MarkerSymbol>,
2719+
[<Optional;DefaultParameterValue(null)>] ?Marker : Marker,
2720+
[<Optional;DefaultParameterValue(null)>] ?ShowDiagonal : bool,
2721+
[<Optional;DefaultParameterValue(null)>] ?Diagonal : SplomDiagonal,
2722+
[<Optional;DefaultParameterValue(null)>] ?ShowLowerHalf : bool,
2723+
[<Optional;DefaultParameterValue(null)>] ?ShowUpperHalf : bool,
2724+
[<Optional;DefaultParameterValue(null)>] ?UseDefaults : bool
27222725
) =
27232726

27242727
let useDefaults = defaultArg UseDefaults true
27252728

2726-
let dims' =
2727-
dims |> Seq.map (fun (k,vals) ->
2728-
Dimensions.init(vals)
2729-
|> Dimensions.style(vals,?Range=Range,?Constraintrange=Constraintrange,Label=k)
2730-
)
2729+
let marker =
2730+
Marker
2731+
|> Option.defaultValue(TraceObjects.Marker.init())
2732+
|> TraceObjects.Marker.style(
2733+
?Color = MarkerColor,
2734+
?Outline = MarkerOutline,
2735+
?Symbol = MarkerSymbol,
2736+
?MultiSymbol = MultiMarkerSymbol,
2737+
?Colorscale = MarkerColorScale
2738+
)
27312739

2732-
Trace2D.initSplom (
2733-
Trace2DStyle.Splom (Dimensions=dims')
2740+
let diagonal =
2741+
Diagonal
2742+
|> Option.defaultValue(TraceObjects.SplomDiagonal.init())
2743+
|> TraceObjects.SplomDiagonal.style(?Visible = ShowDiagonal)
2744+
2745+
Trace2D.initSplom(
2746+
Trace2DStyle.Splom(
2747+
Dimensions = dimensions ,
2748+
?Name = Name ,
2749+
?ShowLegend = ShowLegend ,
2750+
?Opacity = Opacity ,
2751+
?Text = Text ,
2752+
?MultiText = MultiText ,
2753+
Marker = marker ,
2754+
Diagonal = diagonal ,
2755+
?ShowLowerHalf = ShowLowerHalf,
2756+
?ShowUpperHalf = ShowUpperHalf
27342757
)
2735-
|> TraceStyle.Line(?Width=Width,?Color=Color,?Dash=Dash,?Colorscale=Colorscale)
2758+
)
27362759
|> GenericChart.ofTraceObject useDefaults
27372760

2738-
27392761
/// Computes the Splom plot
27402762
[<Extension>]
27412763
static member Splom
27422764
(
2743-
dims:seq<Dimensions>,
2744-
[<Optional;DefaultParameterValue(null)>] ?Color,
2745-
[<Optional;DefaultParameterValue(null)>] ?Colorscale,
2746-
[<Optional;DefaultParameterValue(null)>] ?Width,
2747-
[<Optional;DefaultParameterValue(null)>] ?Dash,
2748-
[<Optional;DefaultParameterValue(null)>] ?Domain,
2749-
[<Optional;DefaultParameterValue(null)>] ?Labelfont,
2750-
[<Optional;DefaultParameterValue(null)>] ?Tickfont,
2751-
[<Optional;DefaultParameterValue(null)>] ?Rangefont,
2752-
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
2765+
keyValues:seq<string*#seq<#IConvertible>>,
2766+
[<Optional;DefaultParameterValue(null)>] ?Name : string,
2767+
[<Optional;DefaultParameterValue(null)>] ?ShowLegend : bool,
2768+
[<Optional;DefaultParameterValue(null)>] ?Opacity : float,
2769+
[<Optional;DefaultParameterValue(null)>] ?Text : #IConvertible,
2770+
[<Optional;DefaultParameterValue(null)>] ?MultiText : seq<#IConvertible>,
2771+
[<Optional;DefaultParameterValue(null)>] ?MarkerColor : Color,
2772+
[<Optional;DefaultParameterValue(null)>] ?MarkerColorScale : StyleParam.Colorscale,
2773+
[<Optional;DefaultParameterValue(null)>] ?MarkerOutline : Line,
2774+
[<Optional;DefaultParameterValue(null)>] ?MarkerSymbol : StyleParam.MarkerSymbol,
2775+
[<Optional;DefaultParameterValue(null)>] ?MultiMarkerSymbol : seq<StyleParam.MarkerSymbol>,
2776+
[<Optional;DefaultParameterValue(null)>] ?Marker : Marker,
2777+
[<Optional;DefaultParameterValue(null)>] ?ShowDiagonal : bool,
2778+
[<Optional;DefaultParameterValue(null)>] ?Diagonal : SplomDiagonal,
2779+
[<Optional;DefaultParameterValue(null)>] ?ShowLowerHalf : bool,
2780+
[<Optional;DefaultParameterValue(null)>] ?ShowUpperHalf : bool,
2781+
[<Optional;DefaultParameterValue(null)>] ?UseDefaults : bool
27532782
) =
27542783

2755-
let useDefaults = defaultArg UseDefaults true
2784+
let dims =
2785+
keyValues
2786+
|> Seq.map (fun (key,vals) -> Dimension.initSplom(Label = key, Values = vals))
27562787

2757-
Trace2D.initSplom (
2758-
Trace2DStyle.Splom (
2759-
Dimensions=dims
2760-
)
2788+
Chart.Splom(
2789+
dims,
2790+
?Name = Name ,
2791+
?ShowLegend = ShowLegend ,
2792+
?Opacity = Opacity ,
2793+
?Text = Text ,
2794+
?MultiText = MultiText ,
2795+
?MarkerColor = MarkerColor ,
2796+
?MarkerColorScale = MarkerColorScale ,
2797+
?MarkerOutline = MarkerOutline ,
2798+
?MarkerSymbol = MarkerSymbol ,
2799+
?MultiMarkerSymbol = MultiMarkerSymbol,
2800+
?Marker = Marker ,
2801+
?ShowDiagonal = ShowDiagonal ,
2802+
?Diagonal = Diagonal ,
2803+
?ShowLowerHalf = ShowLowerHalf ,
2804+
?ShowUpperHalf = ShowUpperHalf ,
2805+
?UseDefaults = UseDefaults
27612806
)
2762-
|> TraceStyle.Line(?Width=Width,?Color=Color,?Dash=Dash,?Colorscale=Colorscale)
2763-
|> GenericChart.ofTraceObject useDefaults

src/Plotly.NET/ChartAPI/ChartDomain.fs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,12 @@ module ChartDomain =
393393
let dims' =
394394
dims
395395
|> Seq.map (fun (k,vals) ->
396-
Dimensions.init(vals)
397-
|> Dimensions.style(vals,?Range=Range,?Constraintrange=Constraintrange,Label=k)
396+
Dimension.initParallel(
397+
Values = vals,
398+
?Range = Range,
399+
?ConstraintRange= Constraintrange,
400+
Label = k
401+
)
398402
)
399403
TraceDomain.initParallelCoord(
400404
TraceDomainStyle.ParallelCoord(
@@ -413,7 +417,7 @@ module ChartDomain =
413417
[<Extension>]
414418
static member ParallelCoord
415419
(
416-
dims:seq<Dimensions>,
420+
dims:seq<Dimension>,
417421
[<Optional;DefaultParameterValue(null)>] ?Color,
418422
[<Optional;DefaultParameterValue(null)>] ?Colorscale,
419423
[<Optional;DefaultParameterValue(null)>] ?Width,
@@ -461,8 +465,12 @@ module ChartDomain =
461465
let dims' =
462466
dims
463467
|> Seq.map (fun (k,vals) ->
464-
Dimensions.init(vals)
465-
|> Dimensions.style(vals,?Range=Range,?Constraintrange=Constraintrange,Label=k)
468+
Dimension.initParallel(
469+
Values = vals,
470+
?Range = Range,
471+
?ConstraintRange= Constraintrange,
472+
Label = k
473+
)
466474
)
467475
TraceDomain.initParallelCategories (
468476
TraceDomainStyle.ParallelCategories(
@@ -480,7 +488,7 @@ module ChartDomain =
480488
[<Extension>]
481489
static member ParallelCategories
482490
(
483-
dims:seq<Dimensions>,
491+
dims:seq<Dimension>,
484492
[<Optional;DefaultParameterValue(null)>] ?Color,
485493
[<Optional;DefaultParameterValue(null)>] ?Colorscale,
486494
[<Optional;DefaultParameterValue(null)>] ?Width,

src/Plotly.NET/Playground.fsx

Lines changed: 66 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
#load "Indicator.fs"
103103
#load "Icicle.fs"
104104
#load "FinanceMarker.fs"
105+
#load "SplomDiagonal.fs"
105106

106107
#I "Traces"
107108

@@ -183,70 +184,81 @@ open FSharp.Data
183184
open Deedle
184185

185186
let data =
186-
Http.RequestString @"https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv"
187+
Http.RequestString @"https://raw.githubusercontent.com/plotly/datasets/master/iris-data.csv"
187188
|> fun csv -> Frame.ReadCsvString(csv,true,separators=",")
188189

189-
let openData : seq<float> = data.["AAPL.Open"] |> Series.values
190-
let highData : seq<float> = data.["AAPL.High"] |> Series.values
191-
let lowData : seq<float> = data.["AAPL.Low"] |> Series.values
192-
let closeData : seq<float> = data.["AAPL.Close"] |> Series.values
193-
let dateData = data |> Frame.getCol "Date" |> Series.values |> Seq.map System.DateTime.Parse
194-
195-
Chart.Candlestick(
196-
openData |> Seq.take 30,
197-
highData |> Seq.take 30,
198-
lowData |> Seq.take 30,
199-
closeData |> Seq.take 30,
200-
dateData |> Seq.take 30
190+
let sepalLengthData = data.["sepal length"] |> Series.values
191+
let sepalWidthData = data.["sepal width"] |> Series.values
192+
let petalLengthData = data.["petal length"] |> Series.values
193+
let petalWidthData = data.["petal width"] |> Series.values
194+
195+
196+
let colors =
197+
data
198+
|> Frame.getCol "class"
199+
|> Series.values
200+
|> Seq.cast<string>
201+
|> Seq.map (fun x ->
202+
match x with
203+
| "Iris-setosa" -> 0.
204+
| "Iris-versicolor" -> 0.5
205+
| _ -> 1
206+
)
207+
|> Color.fromColorScaleValues
208+
209+
Chart.Splom(
210+
[
211+
"sepal length" , sepalLengthData
212+
"sepal width" , sepalWidthData
213+
"petal length" , petalLengthData
214+
"petal width" , petalWidthData
215+
],
216+
MarkerColor = colors
201217
)
202-
|> Chart.show
203-
204-
Chart.Candlestick(
205-
openData,
206-
highData,
207-
lowData,
208-
closeData,
209-
dateData,
210-
IncreasingColor = Color.fromKeyword Cyan,
211-
DecreasingColor = Color.fromKeyword Gray
218+
|> Chart.withLayout(
219+
Layout.init(
220+
HoverMode = StyleParam.HoverMode.Closest,
221+
DragMode = StyleParam.DragMode.Select
222+
)
212223
)
224+
|> Chart.withSize (1000,1000)
213225
|> Chart.show
214226

215-
// Generate linearly spaced vector
216-
let linspace (min,max,n) =
217-
if n <= 2 then failwithf "n needs to be larger then 2"
218-
let bw = float (max - min) / (float n - 1.)
219-
[|min ..bw ..max|]
220227

221-
// Create example data
222-
let size = 100
223-
let x = linspace(-2. * Math.PI, 2. * Math.PI, size)
224-
let y = linspace(-2. * Math.PI, 2. * Math.PI, size)
225-
226-
let f x y = - (5. * x / (x**2. + y**2. + 1.) )
227-
228-
let z =
229-
Array.init size (fun i ->
230-
Array.init size (fun j ->
231-
f x.[j] y.[i]
232-
)
228+
Chart.Splom(
229+
[
230+
"sepal length" , sepalLengthData
231+
"sepal width" , sepalWidthData
232+
"petal length" , petalLengthData
233+
"petal width" , petalWidthData
234+
],
235+
MarkerColor = colors,
236+
ShowDiagonal = false
237+
)
238+
|> Chart.withLayout(
239+
Layout.init(
240+
HoverMode = StyleParam.HoverMode.Closest,
241+
DragMode = StyleParam.DragMode.Select
233242
)
234-
235-
236-
z
237-
|> Chart.Contour
238-
|> Chart.show
239-
240-
Chart.Contour(
241-
z,
242-
ContoursColoring = StyleParam.ContourColoring.Heatmap
243243
)
244+
|> Chart.withSize (1000,1000)
244245
|> Chart.show
245246

246-
Chart.Contour(
247-
z,
248-
ContoursColoring = StyleParam.ContourColoring.Heatmap,
249-
ShowContourLabels = true,
250-
ContourLabelFont = Font.init(Size = 12, Color = Color.fromKeyword White)
247+
Chart.Splom(
248+
[
249+
"sepal length" , sepalLengthData
250+
"sepal width" , sepalWidthData
251+
"petal length" , petalLengthData
252+
"petal width" , petalWidthData
253+
],
254+
MarkerColor = colors,
255+
ShowLowerHalf = false
256+
)
257+
|> Chart.withLayout(
258+
Layout.init(
259+
HoverMode = StyleParam.HoverMode.Closest,
260+
DragMode = StyleParam.DragMode.Select
261+
)
251262
)
263+
|> Chart.withSize (1000,1000)
252264
|> Chart.show

src/Plotly.NET/Plotly.NET.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<Compile Include="Traces\ObjectAbstractions\Indicator.fs" />
108108
<Compile Include="Traces\ObjectAbstractions\Icicle.fs" />
109109
<Compile Include="Traces\ObjectAbstractions\FinanceMarker.fs" />
110+
<Compile Include="Traces\ObjectAbstractions\SplomDiagonal.fs" />
110111
<Compile Include="Traces\Trace.fs" />
111112
<Compile Include="Traces\Trace2D.fs" />
112113
<Compile Include="Traces\Trace3D.fs" />

0 commit comments

Comments
 (0)