Skip to content

Commit aab1840

Browse files
committed
Improve all 3D Charts derived from Scatter3D
1 parent a0e01da commit aab1840

File tree

11 files changed

+483
-243
lines changed

11 files changed

+483
-243
lines changed

Diff for: src/Plotly.NET/ChartAPI/Chart3D.fs

+364-175
Large diffs are not rendered by default.

Diff for: src/Plotly.NET/CommonAbstractions/StyleParams.fs

+26
Original file line numberDiff line numberDiff line change
@@ -2055,6 +2055,32 @@ module StyleParam =
20552055
override this.ToString() = this |> SymbolStyle.toString
20562056
member this.Convert() = this |> SymbolStyle.convert
20572057

2058+
[<RequireQualifiedAccess>]
2059+
type MarkerSymbol3D =
2060+
| Circle
2061+
| CircleOpen
2062+
| Cross
2063+
| Diamond
2064+
| DiamondOpen
2065+
| Square
2066+
| SquareOpen
2067+
| X
2068+
2069+
static member toString = function
2070+
| Circle -> "circle"
2071+
| CircleOpen -> "circle-open"
2072+
| Cross -> "cross"
2073+
| Diamond -> "diamond"
2074+
| DiamondOpen -> "diamond-open"
2075+
| Square -> "square"
2076+
| SquareOpen -> "square-open"
2077+
| X -> "x"
2078+
2079+
static member convert = MarkerSymbol3D.toString >> box
2080+
override this.ToString() = this |> MarkerSymbol3D.toString
2081+
member this.Convert() = this |> MarkerSymbol3D.convert
2082+
2083+
20582084
[<RequireQualifiedAccess>]
20592085
type MarkerSymbol =
20602086
| Modified of MarkerSymbol * SymbolStyle

Diff for: src/Plotly.NET/Playground.fsx

+10
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,16 @@ open Plotly.NET
183183
open FSharp.Data
184184
open Deedle
185185

186+
Chart.Bubble3D(
187+
[for i in 0..10 do yield (i,i,i)],
188+
[0 .. 10 .. 100],
189+
MarkerColor = Color.fromColorScaleValues [0..10],
190+
MarkerSymbol = StyleParam.MarkerSymbol3D.Diamond
191+
)
192+
193+
|> Chart.show
194+
195+
186196
let data =
187197
Http.RequestString @"https://raw.githubusercontent.com/plotly/datasets/master/iris-data.csv"
188198
|> fun csv -> Frame.ReadCsvString(csv,true,separators=",")

Diff for: src/Plotly.NET/Templates/ChartTemplates.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ module ChartTemplates =
504504
]
505505
))
506506

507-
Trace3D.initMesh3d(Trace3DStyle.Mesh3d(
507+
Trace3D.initMesh3D(Trace3DStyle.Mesh3D(
508508
ColorBar = ColorBar.init(
509509
OutlineWidth = 0., Ticks = StyleParam.TickOptions.Empty
510510
)
@@ -531,7 +531,7 @@ module ChartTemplates =
531531
)
532532
))
533533

534-
Trace3D.initScatter3d(Trace3DStyle.Scatter3d(
534+
Trace3D.initScatter3D(Trace3DStyle.Scatter3D(
535535
Line = Line.init(
536536
ColorBar = ColorBar.init(
537537
OutlineWidth = 0., Ticks = StyleParam.TickOptions.Empty

Diff for: src/Plotly.NET/Traces/ObjectAbstractions/Marker.fs

+4-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ type Marker () =
9595
[<Optional;DefaultParameterValue(null)>] ?MultiOpacity : seq<float>,
9696
[<Optional;DefaultParameterValue(null)>] ?Pattern : Pattern,
9797
[<Optional;DefaultParameterValue(null)>] ?Symbol : StyleParam.MarkerSymbol,
98-
[<Optional;DefaultParameterValue(null)>] ?MultiSymbol : seq<StyleParam.MarkerSymbol>,
98+
[<Optional;DefaultParameterValue(null)>] ?MultiSymbol : seq<StyleParam.MarkerSymbol>,
99+
[<Optional;DefaultParameterValue(null)>] ?Symbol3D : StyleParam.MarkerSymbol3D,
100+
[<Optional;DefaultParameterValue(null)>] ?MultiSymbol3D : seq<StyleParam.MarkerSymbol3D>,
99101
[<Optional;DefaultParameterValue(null)>] ?OutlierColor : Color,
100102
[<Optional;DefaultParameterValue(null)>] ?OutlierWidth : int,
101103
[<Optional;DefaultParameterValue(null)>] ?Maxdisplayed : int,
@@ -123,6 +125,7 @@ type Marker () =
123125
(Opacity, MultiOpacity) |> DynObj.setSingleOrMultiOpt marker "opacity"
124126
Pattern |> DynObj.setValueOpt marker "pattern"
125127
(Symbol, MultiSymbol) |> DynObj.setSingleOrMultiOptBy marker "symbol" StyleParam.MarkerSymbol.convert
128+
(Symbol3D, MultiSymbol3D) |> DynObj.setSingleOrMultiOptBy marker "symbol" StyleParam.MarkerSymbol3D.convert
126129
OutlierColor |> DynObj.setValueOpt marker "outliercolor"
127130
OutlierWidth |> DynObj.setValueOpt marker "outlierwidth"
128131
Maxdisplayed |> DynObj.setValueOpt marker "maxdisplayed"

Diff for: src/Plotly.NET/Traces/Trace3D.fs

+58-48
Large diffs are not rendered by default.

Diff for: tests/Plotly.NET.Tests.CSharp/APITest/Chart3DAPITest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ public class Chart3DAPITest
1515
private static readonly Tuple<int, int, int>[] xyz = x.Zip(y).Zip(z).Select(c => new Tuple<int, int, int>(c.Item1.First, c.Item1.Second, c.Item2)).ToArray();
1616

1717
[Fact] public void Scatter3d1()
18-
=> Chart3D.Chart.Scatter3d<int, int, int, int>(x, y, z, StyleParam.Mode.Lines);
18+
=> Chart3D.Chart.Scatter3D<int, int, int, int>(x, y, z, StyleParam.Mode.Lines);
1919
}
2020
}

Diff for: tests/Plotly.NET.Tests.FSharpConsole/Program.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ let main argv =
1818
let y = [19; 26; 55;]
1919
let z = [19; 26; 55;]
2020

21-
Chart.Scatter3d(x,y,z,StyleParam.Mode.Markers)
21+
Chart.Scatter3D(x,y,z,StyleParam.Mode.Markers)
2222
|> Chart.withXAxisStyle("my x-axis", Id=StyleParam.SubPlotId.Scene 1)
2323
|> Chart.withYAxisStyle("my y-axis", Id=StyleParam.SubPlotId.Scene 1)
2424
|> Chart.withZAxisStyle("my z-axis")

Diff for: tests/Plotly.NET.Tests/HtmlCodegen/ChartLayout.fs

+5-4
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ let multiTraceGrid =
163163
Chart.Point([1,2; 2,3], UseDefaults = false)
164164
Chart.PointTernary([1,2,3; 2,3,4], UseDefaults = false)
165165
Chart.Heatmap([[1; 2];[3; 4]], ShowScale=false, UseDefaults = false)
166-
Chart.Point3d([1,3,2], UseDefaults = false)
166+
Chart.Point3D([1,3,2], UseDefaults = false)
167167
Chart.PointMapbox([1,2], UseDefaults = false) |> Chart.withMapbox(Mapbox.init(Style = StyleParam.MapboxStyle.OpenStreetMap))
168168
[
169169
// you can use nested combined charts, but they have to have the same trace type (Cartesian2D in this case)
@@ -182,7 +182,7 @@ let multiTraceSingleStack =
182182
Chart.Point([1,2; 2,3], UseDefaults = false)
183183
Chart.PointTernary([1,2,3; 2,3,4], UseDefaults = false)
184184
Chart.Heatmap([[1; 2];[3; 4]], ShowScale=false, UseDefaults = false)
185-
Chart.Point3d([1,3,2], UseDefaults = false)
185+
Chart.Point3D([1,3,2], UseDefaults = false)
186186
Chart.PointMapbox([1,2], UseDefaults = false) |> Chart.withMapbox(Mapbox.init(Style = StyleParam.MapboxStyle.OpenStreetMap))
187187
[
188188
// you can use nested combined charts, but they have to have the same trace type (Cartesian2D in this case)
@@ -195,6 +195,7 @@ let multiTraceSingleStack =
195195
|> Chart.SingleStack()
196196
|> Chart.withSize(1000,1000)
197197

198+
198199
[<Tests>]
199200
let ``Multicharts and subplots`` =
200201
testList "ChartLayout.Multicharts and subplots" [
@@ -211,7 +212,7 @@ let ``Multicharts and subplots`` =
211212
|> chartGeneratedContains subPlotChart
212213
);
213214
testCase "MultiTrace Subplot grid data" ( fun () ->
214-
"""var data = [{"type":"scatter","mode":"markers","x":[1,2],"y":[2,3],"marker":{},"xaxis":"x","yaxis":"y"},{"type":"scatterternary","mode":"markers","a":[1,2],"b":[2,3],"c":[3,4],"marker":{},"subplot":"ternary2"},{"type":"heatmap","z":[[1,2],[3,4]],"showscale":false,"xaxis":"x3","yaxis":"y3"},{"type":"scatter3d","mode":"markers","x":[1],"y":[3],"z":[2],"line":{},"marker":{},"scene":"scene4"},{"type":"scattermapbox","mode":"markers","lon":[1],"lat":[2],"line":{},"marker":{},"subplot":"mapbox5"},{"type":"box","x":"y","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin1","marker":{},"xaxis":"x6","yaxis":"y6"},{"type":"box","x":"y'","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin2","marker":{},"xaxis":"x6","yaxis":"y6"}];"""
215+
"""var data = [{"type":"scatter","mode":"markers","x":[1,2],"y":[2,3],"marker":{},"xaxis":"x","yaxis":"y"},{"type":"scatterternary","mode":"markers","a":[1,2],"b":[2,3],"c":[3,4],"marker":{},"subplot":"ternary2"},{"type":"heatmap","z":[[1,2],[3,4]],"showscale":false,"xaxis":"x3","yaxis":"y3"},{"type":"scatter3d","mode":"markers","x":[1],"y":[3],"z":[2],"marker":{},"line":{},"scene":"scene4"},{"type":"scattermapbox","mode":"markers","lon":[1],"lat":[2],"line":{},"marker":{},"subplot":"mapbox5"},{"type":"box","x":"y","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin1","marker":{},"xaxis":"x6","yaxis":"y6"},{"type":"box","x":"y'","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin2","marker":{},"xaxis":"x6","yaxis":"y6"}];"""
215216
|> chartGeneratedContains multiTraceGrid
216217
);
217218
testCase "MultiTrace Subplot grid layout" ( fun () ->
@@ -228,7 +229,7 @@ let ``Multicharts and subplots`` =
228229
);
229230

230231
testCase "MultiTrace Single Stack data" ( fun () ->
231-
"""var data = [{"type":"scatter","mode":"markers","x":[1,2],"y":[2,3],"marker":{},"xaxis":"x","yaxis":"y"},{"type":"scatterternary","mode":"markers","a":[1,2],"b":[2,3],"c":[3,4],"marker":{},"subplot":"ternary2"},{"type":"heatmap","z":[[1,2],[3,4]],"showscale":false,"xaxis":"x3","yaxis":"y3"},{"type":"scatter3d","mode":"markers","x":[1],"y":[3],"z":[2],"line":{},"marker":{},"scene":"scene4"},{"type":"scattermapbox","mode":"markers","lon":[1],"lat":[2],"line":{},"marker":{},"subplot":"mapbox5"},{"type":"box","x":"y","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin1","marker":{},"xaxis":"x6","yaxis":"y6"},{"type":"box","x":"y'","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin2","marker":{},"xaxis":"x6","yaxis":"y6"}];"""
232+
"""var data = [{"type":"scatter","mode":"markers","x":[1,2],"y":[2,3],"marker":{},"xaxis":"x","yaxis":"y"},{"type":"scatterternary","mode":"markers","a":[1,2],"b":[2,3],"c":[3,4],"marker":{},"subplot":"ternary2"},{"type":"heatmap","z":[[1,2],[3,4]],"showscale":false,"xaxis":"x3","yaxis":"y3"},{"type":"scatter3d","mode":"markers","x":[1],"y":[3],"z":[2],"marker":{},"line":{},"scene":"scene4"},{"type":"scattermapbox","mode":"markers","lon":[1],"lat":[2],"line":{},"marker":{},"subplot":"mapbox5"},{"type":"box","x":"y","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin1","marker":{},"xaxis":"x6","yaxis":"y6"},{"type":"box","x":"y'","y":[2.0,1.5,5.0,1.5,2.0,2.5,2.1,2.5,1.5,1.0,2.0,1.5,5.0,1.5,3.0,2.5,2.5,1.5,3.5,1.0],"boxpoints":"all","jitter":0.1,"name":"bin2","marker":{},"xaxis":"x6","yaxis":"y6"}];"""
232233
|> chartGeneratedContains multiTraceSingleStack
233234
);
234235
testCase "MultiTrace Single Stack layout" ( fun () ->

Diff for: tests/Plotly.NET.Tests/HtmlCodegen/Charts3D.fs

+11-10
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ let scatterChart =
3232
let y = [19; 26; 55;]
3333
let z = [19; 26; 55;]
3434

35-
Chart.Scatter3d(x,y,z,StyleParam.Mode.Markers, UseDefaults = false)
35+
Chart.Scatter3D(x,y,z,StyleParam.Mode.Markers, UseDefaults = false)
3636
|> Chart.withXAxisStyle("my x-axis", Id=StyleParam.SubPlotId.Scene 1)
3737
|> Chart.withYAxisStyle("my y-axis", Id=StyleParam.SubPlotId.Scene 1)
3838
|> Chart.withZAxisStyle("my z-axis")
@@ -42,7 +42,7 @@ let scatterChart =
4242
let ``3D Scatter charts`` =
4343
testList "Charts3D.3D Scatter charts" [
4444
testCase "3D Scatter charts data" ( fun () ->
45-
"""var data = [{"type":"scatter3d","mode":"markers","x":[19,26,55],"y":[19,26,55],"z":[19,26,55],"line":{},"marker":{}}]"""
45+
"""var data = [{"type":"scatter3d","mode":"markers","x":[19,26,55],"y":[19,26,55],"z":[19,26,55],"marker":{},"line":{}}];"""
4646
|> chartGeneratedContains scatterChart
4747
);
4848
testCase "3D Scatter charts layout" ( fun () ->
@@ -56,7 +56,7 @@ let pointChart =
5656
let y = [19; 26; 55;]
5757
let z = [19; 26; 55;]
5858

59-
Chart.Point3d(x,y,z, UseDefaults = false)
59+
Chart.Point3D(x,y,z, UseDefaults = false)
6060
|> Chart.withXAxisStyle("my x-axis", Id=StyleParam.SubPlotId.Scene 1)
6161
|> Chart.withYAxisStyle("my y-axis", Id=StyleParam.SubPlotId.Scene 1)
6262
|> Chart.withZAxisStyle("my z-axis")
@@ -66,7 +66,7 @@ let pointChart =
6666
let ``3D Point charts`` =
6767
testList "Charts3D.3D Point charts" [
6868
testCase "3D Point charts data" ( fun () ->
69-
"""var data = [{"type":"scatter3d","mode":"markers","x":[19,26,55],"y":[19,26,55],"z":[19,26,55],"line":{},"marker":{}}]"""
69+
"""var data = [{"type":"scatter3d","mode":"markers","x":[19,26,55],"y":[19,26,55],"z":[19,26,55],"marker":{},"line":{}}];"""
7070
|> chartGeneratedContains pointChart
7171
);
7272
testCase "3D Point charts layout" ( fun () ->
@@ -91,7 +91,7 @@ let lineChart =
9191
)
9292
|> List.unzip3
9393

94-
Chart.Line3d(x, y, z, ShowMarkers=true, UseDefaults = false)
94+
Chart.Line3D(x, y, z, ShowMarkers=true, UseDefaults = false)
9595
|> Chart.withXAxisStyle("x-axis", Id=StyleParam.SubPlotId.Scene 1)
9696
|> Chart.withYAxisStyle("y-axis", Id=StyleParam.SubPlotId.Scene 1)
9797
|> Chart.withZAxisStyle("z-axis")
@@ -101,7 +101,7 @@ let lineChart =
101101
let ``Line charts`` =
102102
testList "Charts3D.Line charts" [
103103
testCase "Line data" ( fun () ->
104-
"""var data = [{"type":"scatter3d","mode":"lines+markers","x":[10.0,8.765,5.376,0.699,-4.079,-7.762,-9.458,-8.797,-6.02,-1.898,2.489,6.042,7.925,7.774,5.766,2.536,-1.014,-3.973,-5.664,-5.8,-4.534,-2.366,0.02,1.974,3.058,3.146,2.427,1.303,0.232,-0.428,-0.537],"y":[0.0,4.788,8.373,9.863,8.912,5.799,1.348,-3.295,-6.971,-8.802,-8.415,-6.015,-2.306,1.713,5.025,6.863,6.893,5.27,2.562,-0.437,-2.939,-4.377,-4.536,-3.576,-1.944,-0.209,1.124,1.76,1.684,1.127,0.46],"z":[0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0],"line":{},"marker":{}}];"""
104+
"""var data = [{"type":"scatter3d","mode":"lines+markers","x":[10.0,8.765,5.376,0.699,-4.079,-7.762,-9.458,-8.797,-6.02,-1.898,2.489,6.042,7.925,7.774,5.766,2.536,-1.014,-3.973,-5.664,-5.8,-4.534,-2.366,0.02,1.974,3.058,3.146,2.427,1.303,0.232,-0.428,-0.537],"y":[0.0,4.788,8.373,9.863,8.912,5.799,1.348,-3.295,-6.971,-8.802,-8.415,-6.015,-2.306,1.713,5.025,6.863,6.893,5.27,2.562,-0.437,-2.939,-4.377,-4.536,-3.576,-1.944,-0.209,1.124,1.76,1.684,1.127,0.46],"z":[0.0,0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0],"marker":{},"line":{}}];"""
105105
|> chartGeneratedContains lineChart
106106
);
107107
testCase "Line layout" ( fun () ->
@@ -111,22 +111,23 @@ let ``Line charts`` =
111111
]
112112

113113
let bubbleChart =
114-
Chart.Bubble3d(
114+
Chart.Bubble3D(
115115
[1,3,2; 6,5,4; 7,9,8],
116116
[20; 40; 30],
117-
Labels = ["A"; "B"; "C"],
117+
MultiText = ["A"; "B"; "C"],
118118
TextPosition = StyleParam.TextPosition.TopLeft,
119119
UseDefaults = false
120120
)
121121
|> Chart.withXAxisStyle("x-axis", Id=StyleParam.SubPlotId.Scene 1)
122122
|> Chart.withYAxisStyle("y-axis", Id=StyleParam.SubPlotId.Scene 1)
123123
|> Chart.withZAxisStyle("z-axis")
124124

125+
125126
[<Tests>]
126127
let ``Bubble charts`` =
127128
testList "Charts3D.Bubble charts" [
128129
testCase "Bubble data" ( fun () ->
129-
"""var data = [{"type":"scatter3d","mode":"markers+text","x":[1,6,7],"y":[3,5,9],"z":[2,4,8],"marker":{"size":[20,40,30]},"text":["A","B","C"],"textposition":"top left"}];"""
130+
"""var data = [{"type":"scatter3d","mode":"markers+text","x":[1,6,7],"y":[3,5,9],"z":[2,4,8],"text":["A","B","C"],"textposition":"top left","marker":{"size":[20,40,30]}}];"""
130131
|> chartGeneratedContains bubbleChart
131132
);
132133
testCase "Bubble layout" ( fun () ->
@@ -209,7 +210,7 @@ let meshChart =
209210
let b = Array.init 50 (fun _ -> rnd.NextDouble())
210211
let c = Array.init 50 (fun _ -> rnd.NextDouble())
211212

212-
Trace3D.initMesh3d
213+
Trace3D.initMesh3D
213214
(fun mesh3d ->
214215
mesh3d?x <- a
215216
mesh3d?y <- b

Diff for: tests/Plotly.NET.Tests/Traces/TraceID.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ open Plotly.NET.GenericChart
99
let allTraceTypesChart =
1010
[
1111
Chart.Point([])
12-
Chart.Point3d([])
12+
Chart.Point3D([])
1313
Chart.PointPolar([])
1414
Chart.ChoroplethMap([],[])
1515
Chart.ChoroplethMapbox([],[],obj)

0 commit comments

Comments
 (0)