Uncertainty visualization


his article demonstrates two GIS methods for visualization of uncertainty associated with spatial prediction of continuous and categorical variables. In the case of continuous variables, the key issue is to visualize both predictions and the prediction error at the same time, while in the case of categorical data, the key issue is to visualize multiple memberships and confusion in-between them. Both methods are based on the Hue-Saturation-Intensity (HSI) color model and calculations with colors using the color mixture (CM) concept. Whitening is an intuitive color model – Hue (type of color) is used to visualize values or taxonomic space and whiteness (paleness) is used to visualize the uncertainty. In the case of continuous variables, we use a two-dimensional legend – vertical axis (hues) is used to visualize the predicted values and horizontal axis (whiteness) is used to visualize the prediction error. In the case of categorical variables, a circular legend is used – perimeter (hues) defines the taxonomic space and radial distance represents the confusion. The methods are illustrated using two examples: (a) interpolation of soil thickness using regression-kriging and (b) fuzzy k-means classification of landforms classes. For more details, see some of the following references :

Sample scripts to visualize uncertainty using whitening.
  • Icon R.png whitening.R : R script for visualisation of prediction error (whitening).
  • Icon zip.png VIS_scripts_ILWIS.zip : ILWIS scripts for visualisation of prediction error.
  • Icon zip.png FUZZY_ILWIS_maps.zip : ILWIS scripts and sample datasets for visualisation of multiple memberships (209 KB).


STEP 0: Download and install the most recent version of R/ILWIS and unzip the data to a working directory. ILWIS scripts you should download and unzip to "C:/Program files/ILWIS/Scripts/" folder. Detailed explanation of GIS operations and ILWIS commands can be found in the ILWIS help documentation or user's guides (both available via the 52north initiative). If you need more details on how to create and run a script, I advise you to read the ILWIS 3.0 Academic user's guide chapter 12. The ILWIS script consists of set of commands that can be used with up to nine script parameters. These can be either spatial objects, values or textual strings. A script, in principle, consists of two parts: definition of script parameters and list of commands. Sign "//" is used to exclude to insert comments and explanation of formulas.

Visualization of prediction error

Visualization of uncertainty using whitening in ILWIS


here are two options to visualize uncertainty of predictions: by using colour mixing (VIS_error) or by using pixel mixing (VIS_sim). See also Hengl et al. (2002) for more details about the algorithms used. For pixel mixing, you will also need to derive simulated values (equiprobable realization) instead of using the predictions. Follow this guide to learn how to produce realizations using the same prediction model. The advantage of pixel mixing is that the final map will show both how significant is the short-range variation (nugget variation) and the areas where the model is less certain.

Figure: User-made ILWIS scripts can be called directly from ILWIS.
  • STEP 1: Download the and unzip the ILWIS scripts for visualization of prediction error, best in in the default directory of scripts (e.g. "C:/Program files/ILWIS/Scripts/").
  • STEP 2: Run a script from the to left menu (operations list) or from the main menu -> Operations -> Scripts. Use the help button to find more information about the algorithm. See example of how to enter parameters for the script.
  • STEP 3: If you are using color mixing, you will need to use this legend (legend2D.tif) to create final maps.

TIPS: You can manually change the lower and upper values for both prediction and error maps. Stick to the 0.4 and 0.8 (max 1.0) as the default values for the normalized prediction error values. A satisfactory prediction is when the model explains more than 85% of the total variation (normalized error = 40%). Otherwise, if the values of the normalized error gets above 80%, the model accounted for less than 50% of variability at the validation points and the prediction is unsatisfactory. For more details, see the publications above.

Figure: Visualisation of uncertainty for a quantitative variable (topsoil thickness in cm) interpolated using regression kriging: uncertainty included with whiteness and the accompanying two-dimensional legend. For more details about the case study, read this article.

Purpose of the VIS_error script is to simultaneously visualize the predictions and the estimated prediction error. Input parameters are: %1 - prediction map (z), %2 - z1 lower value, %3 - z2 upper value, %4 - prediction variance map (e), %5 - e1 lower value (default=0.4), %6 - e2 upper value (default=0.8), %7 - original variance, %8 - name of the output file. By default use 40% and 80% for e1 and e2.

Purpose of the VIS_sim script is to simultaneously visualize one realization and the estimated prediction error. Input parameters: %1.mpr - simulated values, %2 - prediction error, %3 - original sampled variance. Note that the results of visualization can often be quite discouraging, depending on the amount of variation explained by the model. To improve the precision of predictions, use block-kriging or try to improve the prediction model.

Visualization of uncertainty using whitening in R

The same algorithm can be also implemented using R computing environment. To be able to run the whitening.R, you will need to first obtain packages rgdal, maptools and colorspace. Note that the results might slightly differ between ILWIS and R, which is mainly to somewhat different HSI-RGB conversion algorithms.

We start by loading the required packages:


For purpose of this exercise, we can use the Geul case study (gstat):


Figure: Values of Zinc predicted using OK - predictions and the kriging variance.

This is a standard way the predictions and the prediction error are visualized. Now, we can visualize both maps together using whitening. We start by setting up threshold levels (lower and upper limits), and stretching the values within that range:


We can generate the HSV bands using:


The HSV values can be converted to RGB bands using:


To display a true RGB image in R, use the SGDF2PCT method (note that SGDF2PCT method is limited to 256 colors only!):


Figure: Predictions and the prediction error (OK) visualized using whitening.
Figure: The universal kriging map is obviously more precise.

In the last step (optional), we can set the right georeference and export the map to e.g. GeoTIFF format:


Visualization of multiple memberships

STEP 1: Download and unzip the ILWIS scripts and sample dataset for visualization of multiple memberships in some working directory (e.g. "d:/ILWIS_maps/"). This is the Wesepe dataset used in the paper of de Gruijter et al. (1997).

Figure: Six membership maps for five soil types (c1 – c5) and one extragrade class (cx). Pixel size is 20 m. The soil classes (Dutch National soil classification system) are: c1 — beek earth soil (coarse); c2 — enk earth soil; c3 — podzoil soil; c4 — beek earth soil (fine); c5 — reworked soil; cx — extragrades;.

STEP 2: Select the representation colors and visualize the multiple memberships:

a) Select colours freely and visualize the memberships using the defuzzification (Simple_RGB).

// ILWIS script:
//Created by: T. Hengl (http://spatial-analyst.net)
//Input parameters: %1-%8 memberships, %9 - domain where the class names and colors are defined
//Purpose: Calculates the MB class having the highest MB value

maxMB_01=max(%1, %2, %3)
maxMB_02=max(%4, %5, %6)
maxMB_03=max(%7, %8)

//max1MB - maximum membership value per pixel

calc max1MB.mpr

// Choose the representation color for that class

Simple_RGB{domain=%9}=iff(max1MB=%1, "c1", iff(max1MB=%2, "c2", iff(max1MB=%3, "c3", iff(max1MB=%4, 
      "c4", iff(max1MB=%5, "c5", iff(max1MB=%6, "ext", ?))))) )
setdom Simple_RGB.mpr %9 [- force]
calc Simple_RGB.mpr -force

breakdep Simple_RGB -force
setdescr Simple_RGB.mpr Legend for the colour map as highest MB

del maxMB_0?.mpr -force

b) Select the colors freely and use the Pixel Mixture technique (PM_RGB). Note that you can also simulate values and produce an animation such as the one down-below.

// ILWIS script:
//Created by T. Hengl (http://spatial-analyst.net)
//Input parameters: %1-%6 membership maps, %7 - domain where the class names and colors are defined
//Purpose: script to calculate mixed pixels, six memberships: c1, c2, c3, c4 ,c5 cx; 
//needs the georeference; domain set at {dom=value;vr=0.000:1.000:0.001}


maxMB_01=max(c1_sim, c2_sim, c3_sim)
maxMB_02=max(c4_sim, c5_sim, cx_sim)
calc max1MB.mpr

PM_sim{domain=%7}=iff(max1MB=c1_sim, "c1", iff(max1MB=c2_sim, "c2", iff(max1MB=c3_sim, 
   "c3", iff(max1MB=c4_sim, "c4", iff(max1MB=c5_sim, "c5", iff(max1MB=cx_sim, "ext", ?))))) )
setdom  PM_sim.mpr %7 [- force]
calc PM_sim.mpr -force

breakdep PM_sim.mpr -force
setdescr PM_sim.mpr Single randomization of pixel mixture for Wesepe dataset

del maxMB_0?.mpr -force

//To run multiple simulations you can use this extra line:
//copy PM_sim.mpr PM_sim01.mpr -breakdep
Figure: The highest membership per pixel - defuzzification. Colors selected freely.
Figure: 10 simulations of visualization using the pixel mixture technique.

b) Select the colour representations using some objective method - see Hengl et al. (2004). You can then also use the colour wheel that reflects geometrical position of class centres in the attribute space. In this case you first need to estimate the Hue values at the color wheel for each class (see table HSI_RGB) and then you can run the script (Cont_RGB).

// ILWIS script:
//Created by: T. Hengl (http://spatial-analyst.net), last update June 2004.
//Input parameters: %1-%6 - membership maps; representation values are in the table "HSI_RGB";
//Purpose: Calculation of the R G B bands based on the membership values and representation values; 
//use zero map for missing maps: zero.mpr=iff(isundef(%1),?,0); no need to calculate the sumMB if it is = 1

sumR = %1*TBLVALUE(HSI_RGB, "R", 1)+%2*TBLVALUE(HSI_RGB, "R", 2)+%3*TBLVALUE(HSI_RGB, "R", 3)
    +%4*TBLVALUE(HSI_RGB, "R", 4)+%5*TBLVALUE(HSI_RGB, "R", 5)+%6*TBLVALUE(HSI_RGB, "R", 6)
sumG = %1*TBLVALUE(HSI_RGB, "G", 1)+%2*TBLVALUE(HSI_RGB, "G", 2)+%3*TBLVALUE(HSI_RGB, "G", 3)
    +%4*TBLVALUE(HSI_RGB, "G", 4)+%5*TBLVALUE(HSI_RGB, "G", 5)+%6*TBLVALUE(HSI_RGB, "G", 6)
sumB =  %1*TBLVALUE(HSI_RGB, "B", 1)+%2*TBLVALUE(HSI_RGB, "B", 2)+%3*TBLVALUE(HSI_RGB, "B", 3)
    +%4*TBLVALUE(HSI_RGB, "B", 4)+%5*TBLVALUE(HSI_RGB, "B", 5)+%6*TBLVALUE(HSI_RGB, "B", 6)
sumMB = %1+%2+%3+%4+%5+%6

// Calculate separate R G B band from as the average value from the representations

cont_R{domain=image}= sumR / sumMB
cont_G{domain=image}= sumG / sumMB
cont_B{domain=image}= sumB / sumMB

calc cont_?.*

// calculate final mixed colors map

cont_RGB=color(cont_R, cont_G, cont_B)
CI_S{dom=Value, vr=0.000:1.000:0.001}=1-cont_RGB_S/210
cont_map=colorhsi(cont_RGB_H, cont_RGB_S, (120+135*CI_S))

calc cont_RGB.mpr
breakdep cont_RGB.mpr -force
calc cont_RGB_?.mpr
calc CI_S.mpr

// add whiteness to visualise the uncertainty

cont_map=colorhsi(cont_RGB_H, cont_RGB_S, (120+135*CI_S))
calc cont_map.mpr

del sum?.mpr -force
del cont_?.mpr -force
del sumMB.mpr -force
Figure: Visualisation of multiple memberships using pixel mixture: (a) mixed colors without any adjustment and (b) mixed colours adjusted for the thematic confusion with circular legend indicating similarity between the categories.

<Rating> Rate this article: 1 Poor and in error 2 Far from ready 3 Needs improvements 4 Minor corrections 5 Very useful!! </Rating>