Presentation of 2D & 3D Datasets

Large data sets are hard for humans to see patterns & relationships, and slow for computers.

2D Data- d =f( x, y)

Can you guess what this dataset represents? Not without help.. but by all means download it and try your own 'visualisations'.

A typical 2D dataset might represent vegetation type; soil conductivity; magnetic field intensity; ground-penetrating radar signal return; and even ( occasionally!) elevation above a datum like sea-level. It may represent isolated and unconnected values ( a sparse set)- say 'a church is here'- or regularly spaced samples of a continuous distribution. Closely related to things like lidar.

The data shown here is 250,000 values, measured on a 500x500 x/y grid. Just looking at the numbers you have NO IDEA what they might represent. Scanning by eye you can see neighbours have similar values, and get a rough idea of max & min. Little else.

However there are ways to make it easier on the eye. One is to colour-code the values. Here I've alrready 'cheated' since I had some idea of max & min, and could therefore better use the colour range.

At the expense of some slowness, it is better to let the computer read all the values & itself find min & max, then use the full colour range possible- and a better palette.

It looks ( perhaps because of prior exposure to similar plots?) as if we may be looking at some kind of surface, rather than randomly scattered values. Can we plot it in a way that emphasises this possibility? One possibility is as a pseudo-perspective view.

Mmm... Could that be a real hill at the top right? A valley snaking towards us?? Perhaps a forking railway or road embankment??? The colour range is being a bit confusing, and the lack of perspective and real-time rotation don't help. And perhaps if it represents areal ground or tree-canopy surface I've got the data inverted???

Another way of helping humans attempting to analse this same data is to allow cross-sections to be examined at will, as done for the following software version- or examine the layers side by side.


I haven't yet tried writing a version to show an x/y 'net'. To be useful with such big datasets you'd need to either scroll across a VEY large image, or perhaps do in vector format like svg. Both do-able in LB.

By now we've a better idea of what is going on. I'll still not tell you what the data represents- it could be ground elevation, but could also be height of tree canopy top, or soil moisture or .....

3D Data d =f( x, y, z)

Now we have a dataset that associates a value with every location in 3D space- sometimes called a voxel. The simplest case is for the data again to be scalar.

A very important case might be atmospheric modelling. Data at each (xyz) 'voxel' would hold pressure, temperature, humidity etc as scalars or vectors. Or a dataset could represent tissue type throughout a whole-body CAT-scan. Or activity in your brain as you sit puzzling over Liberty BASIC! We may be interested in the 'surface' of a real 3D object, or the distribution of something within it.



A more specialised case is the limited 'point cloud' dataset representing xyz coordinates of a surface, whether calculated or scanned. There's a lot of amateur activity scanning small 3-D objects, and commercially lidar is very important.
In all cases, it is MUCH preferable to have interactive ability to 'fly in and around' the structures. The rotating torus requires fast, compiled code to create in real time, so I cheated by showing someone else's results. Failing that ( slow processing) build up an animated GIF, as above right. The code used here in LB used ImageMagick to make the animated GIF. It runs at about this speed, but in LB you see each image frame being created, while in the animation you just see the endpoint of each stage.

ImageMagick can be run from within LB or from the command line- 'convert -resize 200x200 -delay 200 *.bmp anim3D5.gif'.

PS Are you any clearer on what the 2D dataset represented? Look at

Code is available as download.

You may want to visit my other pages at Diga Me!