Skip to content

Commit e8eb0dd

Browse files
Merge pull request #134 from maxstreese/feature/3d-surface
3d Surface Plots
2 parents 264cd2b + 9beec14 commit e8eb0dd

File tree

6 files changed

+63
-5
lines changed

6 files changed

+63
-5
lines changed

core/shared/src/main/scala/plotly/Sequence.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ sealed abstract class Sequence extends Product with Serializable
66

77
object Sequence {
88
final case class Doubles(seq: Seq[Double]) extends Sequence
9+
final case class NestedDoubles(seq: Seq[Seq[Double]]) extends Sequence
910
final case class Strings(seq: Seq[String]) extends Sequence
1011
final case class DateTimes(seq: Seq[LocalDateTime]) extends Sequence
1112

@@ -17,6 +18,8 @@ object Sequence {
1718
Doubles(s.map(_.toDouble))
1819
implicit def fromLongSeq(s: Seq[Long]): Sequence =
1920
Doubles(s.map(_.toDouble))
21+
implicit def fromNestedDoubleSeq(s: Seq[Seq[Double]]): Sequence =
22+
NestedDoubles(s)
2023
implicit def fromStringSeq(s: Seq[String]): Sequence =
2124
Strings(s)
2225
implicit def fromDateTimes(seq: Seq[LocalDateTime]): Sequence =

core/shared/src/main/scala/plotly/Trace.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,28 @@ object Histogram {
235235
Option(histfunc)
236236
)
237237
}
238+
239+
@data class Surface(
240+
x: Option[Sequence],
241+
y: Option[Sequence],
242+
z: Option[Sequence],
243+
showscale: Option[Boolean],
244+
opacity: Option[Double]
245+
) extends Trace
246+
247+
object Surface {
248+
def apply(
249+
x: Sequence = null,
250+
y: Sequence = null,
251+
z: Sequence = null,
252+
showscale: JBoolean = null,
253+
opacity: JDouble = null
254+
): Surface =
255+
Surface(
256+
Option(x),
257+
Option(y),
258+
Option(z),
259+
Option(showscale) .map(b => b: Boolean),
260+
Option(opacity) .map(d => d: Double)
261+
)
262+
}

core/shared/src/main/scala/plotly/layout/Layout.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import dataclass.data
3232
bargap: Option[Double],
3333
bargroupgap: Option[Double],
3434
hovermode: Option[HoverMode],
35-
boxmode: Option[BoxMode]
35+
boxmode: Option[BoxMode],
36+
scene: Option[Scene]
37+
3638
)
3739

3840
object Layout {
@@ -62,7 +64,8 @@ object Layout {
6264
bargap: JDouble = null,
6365
bargroupgap: JDouble = null,
6466
hovermode: HoverMode = null,
65-
boxmode: BoxMode = null
67+
boxmode: BoxMode = null,
68+
scene: Scene = null
6669
): Layout =
6770
new Layout(
6871
Option(title),
@@ -90,6 +93,7 @@ object Layout {
9093
Option(bargap).map(x => x),
9194
Option(bargroupgap).map(x => x),
9295
Option(hovermode),
93-
Option(boxmode)
96+
Option(boxmode),
97+
Option(scene)
9498
)
9599
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package plotly
2+
package layout
3+
4+
import java.lang.{ Integer => JInt, Double => JDouble, Boolean => JBoolean }
5+
6+
import dataclass.data
7+
import plotly.element._
8+
9+
@data class Scene(
10+
xaxis: Option[Axis],
11+
yaxis: Option[Axis],
12+
zaxis: Option[Axis]
13+
)
14+
15+
object Scene {
16+
def apply(
17+
xaxis: Axis = null,
18+
yaxis: Axis = null,
19+
zaxis: Axis = null
20+
): Scene = new Scene(
21+
Option(xaxis),
22+
Option(yaxis),
23+
Option(zaxis)
24+
)
25+
}

render/shared/src/main/scala/plotly/internals/ArgonautCodecsInternals.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ object ArgonautCodecsInternals extends ArgonautCodecsExtra {
4545
implicit val boxMeanBoolIsWrapper: IsWrapper[BoxMean.Bool] = null
4646
implicit val boxPointsBoolIsWrapper: IsWrapper[BoxPoints.Bool] = null
4747
implicit val sequenceDoublesIsWrapper: IsWrapper[Sequence.Doubles] = null
48+
implicit val sequenceNestedDoublesIsWrapper: IsWrapper[Sequence.NestedDoubles] = null
4849
implicit val sequenceStringsIsWrapper: IsWrapper[Sequence.Strings] = null
4950
implicit val sequenceDatetimesIsWrapper: IsWrapper[Sequence.DateTimes] = null
5051
implicit val doubleElementIsWrapper: IsWrapper[Element.DoubleElement] = null

tests/src/test/scala/plotly/doc/DocumentationTests.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,10 @@ class DocumentationTests extends FlatSpec with Matchers {
249249
// TODO Heatmaps
250250
// TODO Heatmap and contour colorscales
251251
// TODO Polar charts
252-
"scientific/log"
252+
"scientific/log",
253253
// TODO Financial charts
254254
// TODO Maps
255-
// TODO 3D charts
255+
"3d/3d-surface"
256256
)
257257

258258
val subDirs = subDirNames.map(new File(dir, _))

0 commit comments

Comments
 (0)