N-Dimensional Space NetLogo Model

Produced for the book series "Artificial Intelligence";

Author: W. J. Teahan; Publisher: Ventus Publishing Aps, Denmark.

powered by NetLogo

view/download model file: N-Dimensional-Space.nlogo

WHAT IS IT?

This model plots a simple set of 5-dimensional data (about 17 New Zealand All Blacks rugby players) using Cartesian co-ordinates as well as parallel co-ordinates.


THE INTERFACE

The three buttons at the bottom left are defined as follows:
- setup : clears both plots;
- setup-left-plots : plots the data using Cartesian co-ordinates in the left hand plots;
- setup-right-plot : plots the data using parallel co-ordinates in the right hand plot.

The three sliders in the middle bottom are defined as follows:
- parallel-startx : where the leftmost vertical axis is drawn for the right hand plot;
- parallel-width : the width between vertical axes for the right hand plot;
- max-y : the maximum height from y = 0 of each vertical axis (highest y co-ordinate
is (+ max-y) and lowest y co-ordinate is (- max-y).

The five switches to the right are defined as follows when set to On:
- plot-locks : this will result in data relating to the locks being plotted;
- plot-props : this will result in data relating to the props being plotted;
- plot-wingers : this will result in data relating to the wingers being plotted;
- plot-half-backs : this will result in data relating to the half-backs being plotted.


HOW IT WORKS

The left plots use the standard NetLogo plotting features to plot the data using the Cartesian co-ordinate system. With 5-dimensional data, a problem occurs when trying to depict the data on a 2-dimensional plot. We can add a third dimension by plotting several lines on the same graph, but that leaves the problem of how to plot the other two dimensions. One solution is to have two graphs, and plot a subset of the dimensions. In the model, the two dimension subsets are: (Weight, Year-of-debut, Position), to show trends in the weights of NZ All Blacks; and (Height, Year-of-debut, Position), to show trends in the heights of NZ All Blacks.

The right plot plots the 5-dimensional data using parallel co-ordinates. It uses patch agents to plot the parallel axes, and labelled points on the axes using the turtle breed axis-points. Each polyline that represents a 5-dimensional point is plotted by having each all-blacks turtle agent move from left to right drawing lines between the parallel axes.


HOW TO USE IT

You can use these plots to spot trends or patterns in the data (such as locks and props being generally heavier and taller than wingers and half-backs, except for Jonah Lomu).


WHAT IS ITS PURPOSE?

Its purpose is to show the problem with visualising n-dimensional data, and the difference between plotting using the Cartesian co-ordinate system and the parallel co-ordinate system.


THINGS TO TRY

See what happens in the right plot when you change the value of the sliders. In some cases, the entire plot will no longer fit in the environment. In this case, you will need to alter the Settings of the environment to suit.

Try turning off the plotting of the locks, props, wingers or half-backs.


EXTENDING THE MODEL

Try adding the capability where the user has more control over what gets plotted. For example: allow the user to decide on which 3-dimensional subset of the data is plotted in the left plots; or allow the user to decide on the order the axes are plotted in the right plot.


RELATED MODELS

See the Missionaries and Cannibals model to see parallel co-ordinates used to plot search space states.


CREDITS AND REFERENCES

To refer to this model in publications, please use:

Teahan, W. J. (2010). N-Dimensional Space NetLogo model.
Artificial Intelligence. Ventus Publishing Aps.


PROCEDURES

; N-Dimensional Space model
; 
; Plots a simple set of N-Dimensional data using Cartesian Co-ordinates
; as well as Parallel Co-ordinates

; Copyright 2010 William John Teahan. All Rights Reserved.

breed [all-blacks all-black]
all-blacks-own [name nval pos pval weight height debut]

breed [axis-points axis-point]
breed [axes axis]
axes-own [axis-x axis-max-y axis-max-value axis-min-value axis-name]



to setup
  ca ;; clear everything

  ; set up the axes on the right plot

  set-default-shape axis-points "line"
  
  ask patches [set pcolor white]
  
  create-axes 1 [set size 0 set axis-x parallel-startx                      set axis-max-y max-y
                 set axis-max-value   16 set axis-min-value    0 set axis-name "Name"]     ; axis turtle agent 0
  create-axes 1 [set size 0 set axis-x parallel-startx + parallel-width     set axis-max-y max-y
                 set axis-max-value    3 set axis-min-value    0 set axis-name "Position"] ; axis turtle agent 1
  create-axes 1 [set size 0 set axis-x parallel-startx + 2 * parallel-width set axis-max-y max-y
                 set axis-max-value  140 set axis-min-value   60 set axis-name "Weight"]   ; axis turtle agent 2
  create-axes 1 [set size 0 set axis-x parallel-startx + 3 * parallel-width set axis-max-y max-y
                 set axis-max-value  210 set axis-min-value  160 set axis-name "Height"]   ; axis turtle agent 3
  create-axes 1 [set size 0 set axis-x parallel-startx + 4 * parallel-width set axis-max-y max-y
                 set axis-max-value 2010 set axis-min-value 1960 set axis-name "Debut"]    ; axis turtle agent 4

  initialise-all-blacks
end  

to setup-parallel-axis [axis-agent]
  ; draws the dimension's axis
    let amax  [axis-max-value] of turtle axis-agent
    let amin  [axis-min-value] of turtle axis-agent
    let axisx [axis-x] of turtle axis-agent
    let amaxy [axis-max-y] of turtle axis-agent
    let aname [axis-name] of turtle axis-agent
        
    if (pxcor = axisx and pycor >= (- amaxy) and pycor <= amaxy)
      [set pcolor black] ;; draws the axis
    if (pxcor = axisx + 8 and pycor = (- amaxy - 8))
      [set plabel aname  set plabel-color black] ;; draws its label
end

to setup-parallel-axis-point [axis-agent pt-range pt-pos pt-label pt-color]
  ; draws a point on the axis
    let axisx [axis-x] of turtle axis-agent 
    let amaxy [axis-max-y] of turtle axis-agent

    create-axis-points 1
    [set color black set size 6 set heading 90
     let interval (2 * amaxy) / pt-range
     set xcor axisx
     set ycor (- amaxy) + pt-pos * interval
     set label pt-label set label-color pt-color] 
end

to setup-parallel-axis-points [axis-turtle pts-color pts-range pts]
  ; draws the axis points
  foreach pts
  [setup-parallel-axis-point axis-turtle pts-range (item 0 ?) (item 1 ?) pts-color]
end

to plot-parallel-points
  ; plots all the points (as paths) using the parallel axes
  
  ask all-blacks
  [
    pen-up
    set size 0 ; don't show the turtle
    set pen-size 1
 
    ; check to see if we need to plot the path first
    let val 0
    let plot-ok true
    ifelse pos = "Lock" [set color (sky - nval + 12) if not plot-locks [set plot-ok false]]
      [ifelse pos = "Prop" [set color (green - nval + 8) if not plot-props [set plot-ok false]]
         [ifelse pos = "Winger" [set color (brown - nval + 4) if not plot-wingers [set plot-ok false]]
            [set color (magenta - nval - 1) if not plot-half-backs [set plot-ok false]]]]

    if plot-ok
      [; plot the path
       foreach [0 1 2 3 4] ; for each axis
         ; axis turtle agents 0 and 1 are nominal attributes - need to convert to a number (i.e. nval and pval)
         [ifelse ? = 0 [set val nval]
            [ifelse ? = 1 [set val pval]
               [ifelse ? = 2 [set val weight]
                  [ifelse ? = 3 [set val height]
                     [set val debut]]]]

          let amaxy   [axis-max-y] of turtle ?
          let aminval [axis-min-value] of turtle ?
          let amaxval [axis-max-value] of turtle ?

          let xpos [axis-x] of turtle ?
          let ypos (- amaxy) + 2 * amaxy * (val - aminval) / (amaxval - aminval)
          setxy xpos ypos
          pen-down
         ]
      ]
  ]
end
 
to setup-right-plot

  ask patches
  [
    set pcolor white ;; make background full of white patches

    foreach [0 1 2 3 4]
      [setup-parallel-axis ?]
  ]

  ; set up the axis marks
  setup-parallel-axis-points 0 blue 16
      (list (list 16 "Chris Jack   ")      (list 15 "Mark Cooksley   ")   (list 14 "Ian Jones   ")       (list 13 "Andy Haden   ")
            (list 12 "Jamie Macintosh   ") (list 11 "Neemiah Tialata   ") (list 10 "Kees Meeuws   ")     (list  9 "Richard Loe   ")
            (list  8 "Joe Rokocoko   ")    (list  7 "Doug Howlett   ")    (list  6 "Jonah Lomu   ")      (list  5 "John Kirwan   ")
            (list  4 "Grant Batty   ")     (list  3 "Piri Weepu   ")      (list  2 "Justin Marshall   ") (list  1 "David Kirk   ")
            (list  0 "Sid Going   "))
  setup-parallel-axis-points 1 blue 3
      (list (list 3 "Locks   ") (list 2 "Props   ") (list 1 "Wingers   ") (list 0 "Half-backs   "))
  setup-parallel-axis-points 2 blue 8
      (list (list 8 "140   ") (list 7 "130   ") (list 6 "120   ") (list 5 "110   ") (list 4 "100   ")
            (list 3  "90   ") (list 2  "80   ") (list 1  "70   ") (list 0  "60   "))
  setup-parallel-axis-points 3 blue 5
      (list (list 5 "210   ") (list 4 "200   ") (list 3 "190   ") (list 2 "180   ") (list 1 "170   ")
            (list 0 "160   "))
  setup-parallel-axis-points 4 blue 5
      (list (list 5 "2010   ") (list 4 "2000   ") (list 3 "1990   ") (list 2 "1980   ") (list 1 "1970   ")
            (list 0 "1960   "))

  ; then set up the line plots
  plot-parallel-points
end

to setup-left-plots

  setup
  
  set-current-plot "Weight of NZ All Blacks"

  if plot-locks
    [set-current-plot-pen "Locks"
     foreach [18 19 20 21]
       [plotxy [debut] of all-black ? [weight] of all-black ? ]]

  if plot-props
    [set-current-plot-pen "Props"
     foreach [14 15 16 17]
       [plotxy [debut] of all-black ? [weight] of all-black ? ]]

  if plot-wingers
    [set-current-plot-pen "Wingers"
     foreach [9 10 11 12 13]
       [plotxy [debut] of all-black ? [weight] of all-black ? ]]

  if plot-half-backs
    [set-current-plot-pen "Half-backs"
     foreach [5 6 7 8]
       [plotxy [debut] of all-black ? [weight] of all-black ? ]]

  set-current-plot "Height of NZ All Blacks"

  if plot-locks
    [
     set-current-plot-pen "Locks"
     foreach [18 19 20 21]
       [plotxy [debut] of all-black ? [height] of all-black ? ]]

  if plot-props
    [set-current-plot-pen "Props"
     foreach [14 15 16 17]
       [plotxy [debut] of all-black ? [height] of all-black ? ]]

  if plot-wingers
    [set-current-plot-pen "Wingers"
     foreach [9 10 11 12 13]
       [plotxy [debut] of all-black ? [height] of all-black ? ]]

  if plot-half-backs
    [set-current-plot-pen "Half-backs"
     foreach [5 6 7 8]
       [plotxy [debut] of all-black ? [height] of all-black ? ]]
end

to initialise-all-blacks
  create-all-blacks 1 [set size 0 set pos "Half-back" set pval 0 set name " Sid Going" set nval 0
                       set weight  81 set height 170  set debut 1967]
  create-all-blacks 1 [set size 0 set pos "Half-back" set pval 0 set name " David Kirk" set nval 1
                       set weight  73 set height 173  set debut 1983]
  create-all-blacks 1 [set size 0 set pos "Half-back" set pval 0 set name " Justin Marshall" set nval 2
                       set weight  95 set height 179  set debut 1995]
  create-all-blacks 1 [set size 0 set pos "Half-back" set pval 0 set name " Piri Weepu" set nval 3
                       set weight  94 set height 178  set debut 2004]
  create-all-blacks 1 [set size 0 set pos "Winger" set pval 1    set name " Grant Batty" set nval 4
                       set weight  70 set height 165  set debut 1972]
  create-all-blacks 1 [set size 0 set pos "Winger" set pval 1    set name " John Kirwan" set nval 5
                       set weight  97 set height 191  set debut 1984]
  create-all-blacks 1 [set size 0 set pos "Winger" set pval 1    set name " Jonah Lomu"  set nval 6
                       set weight 119 set height 196  set debut 1994]
  create-all-blacks 1 [set size 0 set pos "Winger" set pval 1    set name " Doug Howlett" set nval 7
                       set weight  93 set height 185  set debut 2000]
  create-all-blacks 1 [set size 0 set pos "Winger" set pval 1    set name " Joe Rokocoko" set nval 8
                       set weight  98 set height 189  set debut 2003]
  create-all-blacks 1 [set size 0 set pos "Prop" set pval 2      set name " Richard Loe" set nval 9
                       set weight 116 set height 188  set debut 1986]
  create-all-blacks 1 [set size 0 set pos "Prop" set pval 2      set name " Kees Meeuws" set nval 10
                       set weight 121 set height 183  set debut 1998]
  create-all-blacks 1 [set size 0 set pos "Prop" set pval 2      set name " Neemiah Tialata" set nval 11
                       set weight 127 set height 187  set debut 2005]
  create-all-blacks 1 [set size 0 set pos "Prop" set pval 2      set name " Jamie Mackintosh" set nval 12
                       set weight 130 set height 193  set debut 2008]
  create-all-blacks 1 [set size 0 set pos "Lock" set pval 3      set name " Andy Haden" set nval 13
                       set weight 112 set height 199  set debut 1977]
  create-all-blacks 1 [set size 0 set pos "Lock" set pval 3      set name " Ian Jones" set nval 14
                       set weight 104 set height 198  set debut 1990]
  create-all-blacks 1 [set size 0 set pos "Lock" set pval 3      set name " Mark Cooksley" set nval 15
                       set weight 125 set height 205  set debut 1992]
  create-all-blacks 1 [set size 0 set pos "Lock" set pval 3      set name " Chris Jack" set nval 16
                       set weight 115 set height 202  set debut 2001]

end
;
; Copyright 2010 by William John Teahan.  All rights reserved.
;
; Permission to use, modify or redistribute this model is hereby granted,
; provided that both of the following requirements are followed:
; a) this copyright notice is included.
; b) this model will not be redistributed for profit without permission
;    from William John Teahan.
; Contact William John Teahan for appropriate licenses for redistribution for
; profit.
;
; To refer to this model in publications, please use:
;
; Teahan, W. J. (2010).  N Dimensional Space NetLogo model.
;   Artificial Intelligence. Ventus Publishing Aps
;