3D charts can easily be created to visualize data in a new way
Introduction
3D charts also have a very simple API. They can be used to plot data that is varying in 3 dimensions; these dimensions are represented by x, y and z. Therefore the 3D series is represented by the XYZ
component.
Types of 3D Charts Available
A number of 3D charts are available using the Picta library. The basic charts that can be created setting the type
parameter are as follows:
SCATTER3D
: This will transform the series to a 3D scatter chart.CONTOUR
: This will transform the series to a contour plot.HEATMAP
: This transforms the series to a heatmap.SURFACE
: This transforms the series to a surface chart.
The next example will demonstrate how to create a Canvas subplot grid with a number of these charts plotted.
Users looking for more specific functionality should consult the API docs.
An Example: Constructing a grid of subplots for 3D charts
import org.carbonateresearch.picta._
import org.carbonateresearch.picta.options._
// lets create some dummy adata for the third dimension
val x = List(-9, -6, -5 , -3, -1)
val y = List(0, 1, 4, 5, 7)
val z = List(
List(10, 10.625, 12.5, 15.625, 20),
List(5.625, 6.25, 8.125, 11.25, 15.625),
List(2.5, 3.125, 5.0, 8.125, 12.5),
List(0.625, 1.25, 3.125, 6.25, 10.625),
List(0, 0.625, 2.5, 5.625, 10)
)
// we flatten the nested list as we pass it into the Series constructor
val contour = XYZ(x=x, y=y, z=z.flatten, n=z(0).length).asType(CONTOUR)
// set up the chart
val chart1 = Chart()
.addSeries(contour)
.setTitle("Contour")
// plot the chart
chart1.plotInline
// we now flatten the list and pass it into Series constructor, as well as 'n', the length of an element so that the
// heatmap dimensions are correctly constructed
val heatmap = XYZ(z=z.flatten, n=z(0).length) asType HEATMAP
val chart2 = Chart() addSeries heatmap setTitle "Heatmap"
chart2.plotInline
val surface = XYZ(x=x, y=y, z=z.flatten, n=z(0).length) asType SURFACE
val chart3 = Chart() addSeries surface setTitle "Surface" setConfig(false, false)
chart3.plotInline
val x = List.range(1, 100)
val y = List.range(1, 100)
val z = List.range(1, 100).map(e => e + scala.util.Random.nextDouble()*100)
val line = XYZ(x=x, y=y, z=z) asType SCATTER3D drawStyle LINES
val chart4 = Chart() addSeries line setTitle "Line" setConfig(false, false)
chart4.plotInline
val dim = 350
Canvas(2, 2)
.setChart(0, 0, chart1.setDimensions(width = dim, height = dim))
.setChart(0, 1, chart2.setDimensions(width = dim, height = dim))
.setChart(1, 0, chart3.setDimensions(width = dim, height = dim))
.setChart(1, 1, chart4.setDimensions(width = dim, height = dim))
.plotInline
The assembled grid should look like the one below: