Positioning our data

While having floating, coloured spheres in virtual reality is awesome, we do get confronted with the reason why 2D representation is leveraged in the first place: it does make things easier to interpret (nicely structured). When looking at our spheres it's fairly easy to interpret the data based on the size of the spheres (sales volume) or the color (risk), but we shouldn't stop there. We've got loads of other dimensions to represent.

Our current view (size and volume represented):
current view

Now let's try to structure our data further by structuring the spheres leveraging their position. Let's try to order them as follows:

  • On one axis (Z) by risk (low/medium/high)
  • On another axis (X) by potential (low/medium/high)

That would stucture our objects in 9 possible combinations of risk & potential, while also keeping their size to represent sales volume. It would look like this:

Or if we use bars to represent our data:

To be able to have a reference point, I created the dividers in the watery surface and the accompanying text. Once we have our objects (see previous post), shifting their position is pretty straightforward using the transformation functions of Unity:

            // Determine position based on characteristics "Risk" & "Potential"
            if (lv_order == true) {
                    if (string.IsNullOrEmpty (risk)) {
                    } else {
                            switch (risk) {
                            case "Low": 
                                    lv_pos_z = Random.Range (2.00F, 6.00F);
                                    break;
                            case "Medium": 
                                    lv_pos_z = Random.Range (-2.00F, 2.00F);
                                    break;
                            case "High":
                                    lv_pos_z = Random.Range (-2.00F, -6.00F);
                                    break;
                            }
                            if (string.IsNullOrEmpty (potential)) {
                            } else {
                                    switch (potential) {
                                    case "Low": 
                                            lv_pos_x = Random.Range (2.00F, 6.00F);
                                            break;
                                    case "Medium": 
                                            lv_pos_x = Random.Range (-2.00F, 2.00F);
                                            break;
                                    case "High":
                                            lv_pos_x = Random.Range (-2.00F, -6.00F);
                                            break;
                                    }
                                    gameObject.transform.position = new Vector3 (lv_pos_y, 0.50F, lv_pos_x);
                            }
                    }
            }

In the script associated with the object, a couple of variables are made available from the instantiation that we leverage for their representation: risk & potential are imported from the external data, and the lv_order variable I'm passing along to indicate whether we want the data ordered along the axis or not.

So what this code is doing, is determining a random variable for the position of the objects along 2 axis based on their risk or potential (from a position -6 to 6, split over 3 groups). Lovely as that is, obviously this should be made generic based on a metadata definition of the attributes and relative positioning, but it illustrates the idea: based on the position of the object, we now have the abilty to represent 2 additional dimensions in our data. Implying we have 4 already (sales volume, risk & potential), where I've used risk twice to illustrate the grouping of the data.

As we've still got some representational dimensions to choose from, it begins to show the potential of VR:

  • We could leverage the brightness of the objects to stand out
  • The objects could change shape to show sales volume as it evolves over different quarters for example
  • etc..

Comments

comments powered by Disqus