Sie sind auf Seite 1von 98

The soil texture wizard:

R functions for plotting, classifying, transforming


and exploring soil texture data
Julien Moeys
March 8, 2012

10

20

90

30

80

40

0
2

70

[%
]C
lay

Cl

ClLo

70

40

SaCl

50
2

SiCl

60

ilt

50

]S
[%

50

60

SiClLo

30

80

SaClLo
20

90

Lo

SiLo
SaLo

10
LoSa

Si

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Contents
1 About this document
1.1 Why creating The soil
1.2 About R . . . . . . . .
1.3 About the author . . .
1.4 Credits and License . .

texture wizard ?
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

4
4
4
4
5

2 Introduction: About soil texture, texture triangles and texture


classifications
5
2.1 What are soil granulometry and soil texture(s)? . . . . . . . . . .
5
2.2 What are soil texture triangle and classes . . . . . . . . . . . . .
8
3 Installing the package
10
3.1 Installing the package from r-forge . . . . . . . . . . . . . . . . . 10
4 Plotting soil texture triangles and classification systems
11
4.1 An empty soil texture triangle . . . . . . . . . . . . . . . . . . . . 11
4.2 The USDA soil texture classification . . . . . . . . . . . . . . . . 12
4.3 The FAO soil texture classification (also known as European Soil
map, or HYPRES) . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 The French Aisne soil texture classification . . . . . . . . . . . . 17
4.5 The French GEPPA soil texture classification . . . . . . . . . . 19
4.6 The German Bodenartendiagramm (B.K. 1994) soil texture classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.7 The German Standortserkundungsanweisung (SEA 1974) soil
texture classification for forest soils . . . . . . . . . . . . . . . . . 23
4.8 The German landwirtschaftliche Boden (TGL 24300-05, 1985)
soil texture classification for arable soils . . . . . . . . . . . . . . 25
4.9 UK Soil Survey of England and Wales texture classification . . . 27
4.10 The Australian soil texture classification . . . . . . . . . . . . . . 29
4.11 The Belgian soil texture classification . . . . . . . . . . . . . . . 31
4.12 The Canadian soil texture classification . . . . . . . . . . . . . . 33
4.13 The ISSS soil texture classification . . . . . . . . . . . . . . . . . 36
4.14 The Romanian soil texture classification . . . . . . . . . . . . . . 38
4.15 The Polish soil texture classification . . . . . . . . . . . . . . . . 40
4.16 Soil texture triangle with a texture classes color gradient . . . . . 42
4.17 Soil texture triangle with custom texture class colors . . . . . . . 45
5 Overplotting two soil texture classification systems
45
5.1 Case 1: Overplotting two soil texture classification systems with
the same geometry . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 Case 2: Overplotting two soil texture classification systems with
different geometries . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6 Plotting soil texture data
6.1 Simple plot of soil texture data . . . . . . . . . . . .
6.2 Bubble plot of soil texture data and a 3rd variable .
6.3 Heatmap and / or contour plot of soil texture data
variable . . . . . . . . . . . . . . . . . . . . . . . . .

. . . .
. . . .
and a
. . . .

. . .
. . .
4th
. . .

47
47
48
52

6.4
6.5
6.6

Two-dimensional kernel (probability) density estimation for texture data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Contour plot of texture data Mahalanobis distance . . . . . . . .
Plotting text in a texture triangle . . . . . . . . . . . . . . . . . .

55
56
59

7 Control of soil texture data in The Soil Texture Wizard


60
7.1 Normalizing soil texture data (sum of the 3 texture classes) . . . 61
7.2 Normalizing soil texture data (sum of X texture classes) . . . . . 61
8 Classify soil texture data: TT.points.in.classes()
9 Converting soil texture data and systems with different siltsand particle size limit
9.1 Transforming soil texture data (from 3 particle size classes) . . .
9.2 Transforming soil texture data (from 3 or more particle size classes)
9.3 Plotting and transforming on the fly soil texture data . . . . . .
9.4 Plotting and transforming on the fly soil texture triangles / classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.5 Classifying and transforming on the fly soil texture data . . . .
9.6 Using your own custom transformation function when plotting or
classifying soil texture data . . . . . . . . . . . . . . . . . . . . .

61
63
65
66
68
69
74
76

10 Customize soil texture triangles geometry


78
10.1 Customise angles . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
10.2 Customize texture class axis . . . . . . . . . . . . . . . . . . . . . 80
10.3 Customise axis direction . . . . . . . . . . . . . . . . . . . . . . . 80
10.4 Customise everything: plot The French GEPPA classification in
the French Aisne triangle . . . . . . . . . . . . . . . . . . . . . . 81
10.5 Miscellaneous: Different triangle geometry, but same projected
classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
11 Internationalization: title, labels and data names in different
languages
11.1 Choose the language of texture triangle axis and title . . . . . . .
11.2 Use custom (columns) names for soil texture data . . . . . . . . .
11.3 Use custom labels for the axis . . . . . . . . . . . . . . . . . . . .

83
83
86
87

12 Checking the geometry and classes boundaries of soil texture


classifications
89
12.1 Checking the geometry of soil texture classifications . . . . . . . 89
12.2 Checking classes names and boundaries of soil texture classifications 90
13 Adding your own, custom, texture triangle(s)

92

14 Further readings

95

About this document

1.1

Why creating The soil texture wizard ?

Officially: The Soil Texture Wizard R functions are an attempt to provide


a generic toolbox for soil texture data in R. These functions can (1) plot soil
texture data (2) classify soil texture data, (3) transform soil texture data from
and to different systems of particle size classes, and (4) provide some tools to
explore soil texture data (in the sense of a statistical visual analysis). All there
tools are designed to be inherently multi-triangles, multi-geometry and multiparticle sizes classification
Officiously: What was initially a slight reshape of R PLOTRIX package
(by J. Lemon and B. Bolker), for my personal use1 , to add the French Aisne
soil texture triangle, gradually skidded and ended up in a totally reshaped and
extended code (over a 3 year period). There is unfortunately no compatibility
at all between the two codes.

1.2

About R

This document is about functions (and package project) written in R language


and environment for statistical computing(http://www.R-project.org) ([23]),
and has been generated with R version 2.14.2 (2012-02-29).
R website: <http://www.R-project.org>
If you dont know about R, it is never too later to start...

1.3

About the author

I am an agriculture engineer, soil scientist and R programmer. See my website


for more details (http://julienmoeys.free.fr/).
The R functions presented in this document may not always conform to the
best R programming practices, they are nevertheless programmed carefully,
well checked, and should work efficiently for most uses.
At this stage of development, some bugs should still be expected. The code
has been written in 3 years, and tested quite extensively since then, but it has
never been used by other people. If you find some bugs, please contact me at:
jules_78-soiltexture@AT@yahoo.fr.
1 It

was also an excellent way to learn R.

1.4

Credits and License

This document, as well as this document source code (written in Sweave 2 , R 3


and LATEX4 ) are licensed under a Creative Commons By-SA 3.0 unported
5
.
In short, this means (extract from the abovementioned url at creativecommons.org):
You are free to:

to Share - to copy, distribute and transmit the work;


to Remix - to adapt the work.
Under the following conditions:

Attribution - You must attribute the work in the manner specified


by the author or licensor (but not in any way that suggests that they
endorse you or your use of the work);
Share Alike - If you alter, transform, or build upon this work, you
may distribute the resulting work only under the same, similar or a
compatible license.
The soil texture wizard R functions are licensed under a Affero GNU General Public License Version 3 (http://www.gnu.org/licenses/agpl.html).
Given the fact that a lot of the work presented here has been done on my
free time, and given its highly permissive license, this document is provided
with NO responsibilities, guarantees or supports from the author or
his employer (Swedish University of Agricultural Sciences).
Please notice that the R software itself is licensed under a GNU General
Public License Version 2, June 1991.
This tutorial has been created with the (great) Sweave tool, from Friedrich
Leisch ([17]). Sweave allows the smooth integration of R code and R output
(including figures) in a LATEXdocument.

Introduction: About soil texture, texture triangles and texture classifications

2.1

What are soil granulometry and soil texture(s)?

Soil granulometry is the repartition of soil solid particles between (a range


of) particle sizes. As the range of particle sizes is in fact continuous, they have
been subdivided into different particle size classes.
2 http://en.wikipedia.org/wiki/Sweave
3 http://www.r-project.org
4 http://en.wikipedia.org/wiki/LaTeX
5 http://creativecommons.org/licenses/by-sa/3.0/

The most common subdivision of soil granulometry into classes is the fine
earth, for particles ranging from 0 to 2mm (2000m), and coarse particles,
for particles bigger than 2mm. Only the fine earth interests us in this document, although the study of soil granulometry can be extended to the coarse
fraction (for stony soils).
Fine earth is generally (but not always; see below) divided into 3 particle size classes: clay (fine particles), silt (medium size particles)
and sand (coarser particles in the fine earth). All soil scientists use the
range 0-2m for clay. So silt lower limit is also always 2m. But the convention for silt / sand particle size limit varies from country to country.
Silt particle size range can be 2-20m (Atterberg system[20][24]; International
system; ISSS6 . The ISSS particle size system should not be confused with the
ISSS texture triangle (See 4.13, p. 36); Australia7 [20]; Japan[24]), 2-50m
(FAO8 ; USA; France[20][25]), 2-60m (UK and Sweden[24]) or 2-63m (Germany, Austria, Denmark and The Netherlands[24]). Logically, sand particle
size range also varies accordingly to these systems: 20-2000m, 50-2000m,
60-2000meters or 63-2000meters.
Silt class is sometimes divided into fine silts and coarse silts, and sand
class is sometimes divided into fine sand and coarse sand, but in this document / package, we only focus on clay / silt / sand classes.
Below is a scheme representing the different particle size classes used in
France (with Cl for Clay, FiSi for Fine Silt, CoSi for Coarse Silt, FiSa for Fine
Sand, CoSa for Coarse Sand, Gr for Gravels and St for Stones). The figure is
adapted from Moeys 2007[21], and based on information from Baize & Jabiol
1995[5]. The particle size axis (abscissa) is log-scale:

Cl

FiSi

2m

CoSi

FiSa

CoSa

20m 50m 200m


Soil particule sizes

2mm

Gr

St

2cm

Soil particles and each soil particle size class occupy a given volume in
the soil, and have a given mass. They are nevertheless generally not expressed
as absolute volumetric quantities9 . They are expressed as relative abundance, that is kilograms of particles of a given class per kilograms of
fine earth. These measurements are also always made on dehydrated soil samples (dried slightly above 100 C), in order to be independent from soil water
content (which varies a lot in time and space).
Soil texture is defined as the relative abundance of the 3 particle size
6 ISSS:

International Society of Soil Science. Now IUSS (www.iuss.org), International


Union of Soil Science
7 Strangely, only a small number of countries have adopted the so called international
system
8 Food and Agriculture Organization of the United Nations (www.fao.org)
9 for instance kilograms of clay per liters of soil, or liters of clay per liter of soil

classes: clay, silt and sand10 .


In summary, important information to know when talking about soil texture
(and using these functions):
Soils fine earth is generally (but not always) divided into 3 soil texture
classes:

Clay;
Silt;
Sand.
The silt / sand limit varies:

20m; or
50m; or
60m; or
63m.
Soil texture measurement do have a specific unit and a corresponding sum
of the 3 texture classes, that is constant:

in % or g.100g 1 (sum: 100); or


in fraction [] or kg.kg 1 (sum: 1); or
in g.kg 1 (sum: 1000);
More than 3 particle size classes?
Some country have a particle size classes system that differ from the common
clay silt sand triplet. Sweden is using a system with 4 particle size classes: Ler
[0-2m], Mj
ala [2-20m], Mo [20-200m] and Sand [200-2000m] (See table 1
p.9 in Lidberg 2009[18]). Ler corresponds to clay. When considering the International or Australian particle size system (silt-sand limit 20m), Mjala is silt,
and Mo + Sand is sand. When considering other systems with a silt-sand limit
at 50m, 60m or 63m, Mj
ala is fine-silt, Mo is coarse-silt + fine sand, and
Sand is coarse-sand.
The Soil Texture Wizard has been made for systems with 3 particle size
classes (clay, silt and sand), because soil texture triangles have 3 sides,
and thus can only represent texture data that are divided into 3
particle size classes. There are methods to estimate 3 particle size classes
when more classes are presented in the data (although the best is to measure
texture so it also can fit a system with 3 particle size classes system).
10 But

some systems define for than 3 particle size classes for soil texture

2.2

What are soil texture triangle and classes

Soil texture triangles are also called soil texture diagrams.


Soil texture can be plotted on a ternary plot (also called triangle plot).
In a ternary plot, 3D coordinates, which sum is constant, are projected in the
2D space, using simple trigonometry rules. The texture of a soil sample can be
plotted inside a texture triangle, as shown in the example below for the texture
45% clay, 38% silt and 17% sand:

10

20

90

40

70

60

50

5
2

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

m
70

40

80

30

90

20

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

When mapping soil, field pedologists usually estimate texture by manipulating a moist (but not saturated) soil sample in their hand. Depending on the
relative importance of clay silt and sand, the mechanical properties of the soil
(plasticity, stickyness, roughness) varies. Pedologists have classified clay silt
and sand relative abundance as a function of what they could feel in the field:
they have divided the soil texture space into classes.
Soil particle size classes (clay, silt and sand) should not be confused
with soil texture classes. While the first are ranges of particle sizes, the latter
are defined by a range of clay, silt and sand (see the graph below). Soil texture
should not be confused with the concept of soil structure, that concerns the
way these particles are arranged together (or not) into peds, clods and aggregates (etc.) of different size and shape11 . This document does not deal with soil
structure.
11 In

the same way bricks and cement (the texture) can be arranged into a house (the
structure)

Soil texture classes are convenient to represent soil texture on soil maps12 ,
and there use is quite broad (soil description, soil classification, pedogenesis,
soil functional properties, pedotransfer functions, etc.). One of these texture
classification systems is the FAO system. Here is the representation of the same
point as in the graph above, but with the FAO soil classification system on the
background.

10

20

90

30

80

40
60

50

70

m
0

40

5
2

60

ilt

50

]S
[%

[%
]

Cla
y0
2

VF
70

80

30

20

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The soil texture class symbols are:

1
2
3
4
5

abbr
VF
F
M
MF
C

name
Very fine
Fine
Medium
Medium fine
Coarse

Table 1: Texture classes of the FAO system / triangle


The main characteristics of the graph (texture triangle) are:
3 Axis, graduated from 0 to 100%, each of them carrying 1 particle size
class.

Sand on the bottom axis;


Clay on the left axis;
12 It is more easy to represent 1 variable, soil texture class, than 3 variables: clay silt and
sand

Silt on the right axix.


It is possible to permute clay, silt and sand axis, but this choice depend
on the particle size classification used.
Inside the triangle, the lines of equi-values for a given axis/particle size
class are ALWAYS parallel to the (other) axis that intersect the axis of
interest at zero (minimum value).
The 3 axis intersect each other in 3 submits, that are characterized by
an angle. In the example above, all 3 angles are 60 degrees. But other
angles are possible, depending on the soil texture classification used. It is
for instance possible to have a 90 degrees angle on the left, and 45 degrees
angles on the top and on the right (right-angled triangle).
The 3 axis have a direction of increasing texture abundance. This direction is often referred as clock or anticlock, but they can also be directed
inside the triangle in some cases. In the example above, all the axis are
clockwise: texture increase when rotating in the opposite direction as a
clock.
Labeled ticks are placed at regular intervals (10%) on the texture triangle
axes, apart if the axis is directed inside the triangle. Ticks can be placed
at irregular intervals if they are placed at each value taken by the texture
class polygons vertices (This is a smart representation, unfortunately not
implemented here).
An broken arrow is drawn parallel to each axis. The first part indicate
the direction of increasing value, and the second, broken, part indicates
the direction of the equi-value for that axis/texture class.
The axis labels indicates the texture class concerned, and should ideally
remind the particle size limits, because these limits are of crucial importance when (re)using soil texture data (Silt and Sand does not exactly
mean the same particle size limits everywhere).
Soil texture class boundaries are drawn inside the triangle. They
are 2D representation of 3D limits. They are generally labeled with soil
texture class abbreviations (or full names).
Inside the triangle frame, a grid can be represented, for each ticks and
ticks label drawn outside the triangle.

3
3.1

Installing the package


Installing the package from r-forge

The Soil Texture Wizard is now available on CRAN 13 and r-forge 14 , under the
project name soiltexture. The package can be installed from CRAN with the
following commands:
13 http://cran.r-project.org/package=soiltexture
14 http://r-forge.r-project.org/

10

install.packages( pkgs = "soiltexture" )


And if you have the latest R version installed, and want the latest
development version of the package, from r-forge, type the following commands:
install.packages(
pkgs = "soiltexture",
repos = "http://R-Forge.R-project.org"
)
#
It can then be loaded with the following command:
require( soiltexture )
If you get bored of the package, you can unload it and uninstall it with the
following commands:
detach( package:soiltexture )
remove.packages( "soiltexture" )
If you dont have the latest R version, please try to install the package from
the binaries. In the next section, an example is given for R under MS Windows
systems (Zip binaries).

Plotting soil texture triangles and classification systems

The package comes with 8 predefined soil texture triangles. Empty (i.e. without
soil textures data) soil texture triangles can be plotted, in order to obtain smart
representation of the soil texture classification. Of course, it is also possible to
plot classification free texture triangles.

4.1

An empty soil texture triangle

Below is the code to display an empty triangle (without classification and without data):
TT.plot( class.sys = "none" )

11

10

Texture triangle

20

90

40

70

60

0
5

50

60

50

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

m
70

40

80

30

90

20

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The option class.sys (characters) determines the soil texture classification


system used. If set to none, an empty soil texture triangle is plotted.
Without further options, the plotted default soil texture triangle has the
same geometry as the FAO, USDA or French Aisne soil texture triangles (i.e.
all axis are clockwise, all angles are 60 degrees, sand is on the bottom axe, clay
on the left and silt on the right).
The default unit is always percentage (0 to 100%). It is also equivalent to
g.100g 1 .

4.2

The USDA soil texture classification

To display a USDA texture triangle, type:


TT.plot( class.sys = "USDA.TT" )

12

10

Texture triangle: USDA

20

90

40

70
Cl

60

50
ClLo

70

SaCl

40

0
5

SiCl

60

50

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

SiClLo

30

80

SaClLo
20

90

Lo

SiLo
SaLo

10
LoSa

Si

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

When the option class.sys is set to "USDA.TT", a soil texture triangle with
USDA classification system is used.
The USDA soil texture triangle has been built considering a silt - sand limit
of 50meters.
See the table for soil texture classes symbols.

1
2
3
4
5
6
7
8
9
10
11
12

abbr
Cl
SiCl
SaCl
ClLo
SiClLo
SaClLo
Lo
SiLo
SaLo
Si
LoSa
Sa

name
clay
silty clay
sandy clay
clay loam
silty clay loam
sandy clay loam
loam
silty loam
sandy loam
silt
loamy sand
sand

Table 2: Texture classes of the USDA system / triangle

13

The reference used to digitize this triangle is the Soil Survey Manual (Soil
Survey Staff 1993[26]).

14

4.3

The FAO soil texture classification (also known as European Soil map, or HYPRES)

To display a FAO / HYPRES texture triangle, type:


TT.plot( class.sys = "FAO50.TT" )

10

Texture triangle: FAO/HYPRES

20

90

30

80

40
60

50

ilt

50

]S
[%

[%
]

Cla
y0
2

VF
70

60

50
2

m
70

40

80

30

20

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

De Forges et al. 2008[25] pointed out the fact that the silt-sand particle
size limit that is officially related to the FAO soil texture triangle has changed
over time, 50m, then 63m, and then again 50m for some projects. We here
consider that the FAO / EU Soil map / HYPRES soil texture triangle has a silt
- sand limit of 50m. As this choice is somehow arbitrary, we have named the
FAO option "FAO50.TT" in order to avoid any confusion. It will be explained
later in the document how it is possible to add a custom texture triangle to
the existing list, that could for instance be used to configure an FAO texture
triangle with another silt - sand limit.
See the table for soil texture classes symbols.
The references used to digitize this triangle is the texture triangle provided
by the HYPRES project web site ([10]). The The Canadian Soil Information
System (CanSIS) also provides some details on this triangle ([3]).

15

1
2
3
4
5

abbr
VF
F
M
MF
C

name
Very fine
Fine
Medium
Medium fine
Coarse

Table 3: Texture classes of the FAO system / triangle

16

4.4

The French Aisne soil texture classification

To display a French Aisne texture triangle, type:


TT.plot( class.sys = "FR.AISNE.TT" )

10

Texture triangle: Aisne (FR)

20

90

40

70
ALO

60

50
2

50

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

40
AL

70

A
AS

LAS

LSA
20

80

30
LA

90

SA

LS

LMS

LM

10
SL

LLS

LL

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The French Aisne soil texture triangle has been built considering a silt - sand
limit of 50meters.
See the table for soil texture classes symbols15 .
The references used for digising this triangle is Baize and Jabiol 1995[5] and
Jamagne 1967[15]. This triangle may be referred as the Triangle des textures de
la Chambre dAgriculture de lAisne (en: texture triangle of the Aisne extension
service).

15 In classes 14 and 15, leger should be replaced by l


eger. R (and Sweave) can not display
french accents easily, and I found no easy trics for displaying them.

17

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

abbr
ALO
A
AL
AS
LA
LAS
LSA
SA
LM
LMS
LS
SL
S
LL
LLS

name
Argile lourde
Argile
Argile limoneuse
Argile sableuse
Limon argileux
Limon argilo-sableux
Limon sablo-argileux
Sable argileux
Limon moyen
Limon moyen sableux
Limon sableux
Sable limoneux
Sable
Limon leger
Limon leger sableux

Table 4: Texture classes of the French Aisne system / triangle

18

4.5

The French GEPPA soil texture classification

To display a French GEPPA texture triangle, type:


TT.plot( class.sys = "FR.GEPPA.TT" )
Texture triangle: GEPPA (FR)

90

[%] Clay 02 m

80

AA

70

60

50

an

]S
[%

0
2
50

40

00

As

Als
Al
30
AS
LAS

La

20
Sa

Sal

10

Lsa

S
Sl

Ls

SS

90

80

70

60

50

40

30

20

10

LL

[%] Silt 250 m

The French GEPPA soil texture triangle has been built considering a silt sand limit of 50meters.
See the table for soil texture classes symbols.
This triangle has been digitized after sols-de-bretagne.fr 2009[27]. The
website refers to an illustration from Baize and Jabiol 1995[5]. GEPPA means
Groupe dEtude pour les Probl`emes de Pedologie Appliquee (en: Group for
the study of applied pedology problems / questions).

19

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

abbr
AA
A
As
Als
Al
AS
LAS
La
Sa
Sal
Lsa
L
S
SS
Sl
Ls
LL

name
Argile lourde
Argileux
Argile sableuse
Argile limono-sableuse
Argile limoneuse
Argilo-sableux
Limon argilo-sableux
Limon argileux
Sable argileux
Sable argilo-limoneux
Limon sablo-argileux
Limon
Sableux
Sable
Sable limoneux
Limon sableux
Limon pur

Table 5: Texture classes of the French GEPPA system / triangle

20

4.6

The German Bodenartendiagramm (B.K. 1994) soil


texture classification

To display a German Bodenartendiagramm (BK 1994) texture triangle, type:


TT.plot( class.sys = "DE.BK94.TT" )
Texture triangle: Bodenkundliche Kartieranleitung 1994 (DE)

90

Uu

80
Ut2
[%] Silt 263 m

Ut3
Ut4
70

Tu4
Us

60
Uls

Lu

Tu3

Slu

Ls2
Lt2

Lt3

0
2
63

40

Su4

an

]S
[%

50

00

Tu2

Ls3
Su3
30
Sl3 Sl4
Ls4

Lts

Tl

20
Su2 Sl2

Tt

10
Ts3

40

Ss

Ts4

30

St3

Ts2

St2

90

80

70

60

50

20

10

[%] Clay 02 m

The German Bodenartendiagramm (BK 1994) soil texture triangle has been
built considering a silt - sand limit of 63meters.
See the table for soil texture classes symbols.
The references used to digitize this triangle and name the classes are de.wikipedia.org
2009 [4] and nibis.ni.schule.de 2009[2]. The triangle is also presented in
GEOVLEX 2009[12] (Online lexicon from the Halle-Wittenberg University) and
Bormann 2007[6] (for quadruple check). The triangle is referred as Bodenartendiagramm Korngr
oendreieck from Bodenkundliche Kartieranleitung 1994.

21

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

abbr
Ss
Su2
Sl2
Sl3
St2
Su3
Su4
Slu
Sl4
St3
Ls2
Ls3
Ls4
Lt2
Lts
Ts4
Ts3
Uu
Us
Ut2
Ut3
Uls
Ut4
Lu
Lt3
Tu3
Tu4
Ts2
Tl
Tu2
Tt

name
reiner Sand
Schwach schluffiger Sand
Schwach lehmiger Sand
Mittel lehmiger Sand
Schwach toniger Sand
Mittel schluffiger Sand
Stark schluffiger Sand
Schluffig-lehmiger Sand
Stark lehmiger Sand
Mittel toniger Sand
Schwach sandiger Lehm
Mittel sandiger Lehm
Stark sandiger Lehm
Schwach toniger Lehm
Sandig-toniger Lehm
Stark sandiger Ton
Mittel sandiger Ton
Reiner Schluff
Sandiger Schluff
Schwach toniger Schluff
Mittel toniger Schluff
Sandig-lehmiger Schluff
Stark toniger Schluff
Schluffiger Lehm
Mittel toniger Lehm
Mittel schluffiger Ton
Stark schluffiger Ton
Schwach sandiger Ton
Lehmiger Ton
Schwach schluffiger Ton
Reiner Ton

Table 6: Texture classes of the German system / triangle

22

4.7

The German Standortserkundungsanweisung (SEA


1974) soil texture classification for forest soils

To display a German Standortserkundungsanweisung (SEA 1974) texture triangle for forest soils[31], type:
TT.plot( class.sys = "DE.SEA74.TT" )
Texture triangle: Standortserkundungsanweisung SEA 1974 (DE)

90

[%] Silt 263 m

80

70

lU
UL

60

uT

an

]S
[%

50

0
2
63

40

00

sL

L
lT

30
lS
20

10

alS

stL
sT

90

80

70

60

50

40

30

20

10

[%] Clay 02 m

The SEA 1974 soil texture classification has been built considering a silt sand limit of 63meters.
See the table for soil texture classes symbols:
Many thanks to Rainer Petzold (Staatsbetrieb Sachsenforst) for providing
the code of this triangle.
The original isosceles version of the triangle can be obtained by typing:
TT.plot(
class.sys = "DE.SEA74.TT",
blr.clock
= rep(T,3),
tlr.an
= rep(60,3),
blr.tx
= c("SAND","CLAY","SILT"),
)
#

23

abbr
L
stL
sL
S
alS
lS
T
uT
lT
sT
U
UL
lU

1
2
3
4
5
6
7
8
9
10
11
12
13

name
Lehm
sandig-toniger Lehm
sandiger Lehm
Sand
anlehmiger Sand
lehmiger Sand
Ton
schluffiger Ton
lehmiger Ton
sandiger Ton
Schluff
Schlufflehm
lehmiger Schluff

Table 7: Texture classes of the German SEA 1974 system / triangle

10

Texture triangle: Standortserkundungsanweisung SEA 1974 (DE)

20

90

40

70
T

60

63
2

50

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

40

lT
uT

70

sT

UL

90

stL

20

80

30

sL
10

lU
lS

alS

10

20

30

40

50

60

70

80

90

[%] Sand 632000 m

24

4.8

The German landwirtschaftliche Bo


den (TGL 2430005, 1985) soil texture classification for arable soils

To display a German TGL 1985 texture triangle for arable soils[29], type:
TT.plot( class.sys = "DE.TGL85.TT" )
Texture triangle: TGL 2430005, landwirtschaftliche Boeden (DE)

90
U

[%] Silt 263 m

80

70
lU
UL
60

50

an

]S
[%

uT

0
2
63

40

00

uS

30

sL
L

lT

20
T

l'S lS

l''S
10
sT

rS

90

80

70

60

50

40

30

20

10

[%] Clay 02 m

The TGL 1985 soil texture classification has been built considering a silt sand limit of 63meters.
See the table for soil texture classes symbols:
Many thanks to Rainer Petzold (Staatsbetrieb Sachsenforst) for providing
the code of this triangle.
The original isosceles version of the triangle can be obtained by typing:
TT.plot(
class.sys = "DE.TGL85.TT",
blr.clock
= rep(T,3),
tlr.an
= rep(60,3),
blr.tx
= c("SAND","CLAY","SILT"),
)
#

25

abbr
rS
lS
lS
lS
uS
U
lU
sL
L
UL
uT
lT
sT
T

1
2
3
4
5
6
7
8
9
10
11
12
13
14

name
reiner Sand
sehr schwach lehmiger Sand
schwach lehmiger Sand
stark lehmiger Sand
schluffiger Sand
Schluff
lehmiger Schluff
sandiger Lehm
Lehm
Schlufflehm
schluffiger Ton
lehmiger Ton
sandiger Ton
Ton

Table 8: Texture classes of the German TGL 1985 system / triangle

10

Texture triangle: TGL 2430005, landwirtschaftliche Boeden (DE)

20

90

70

40

T
60

50
lT

40

63
2

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

uT

70

sT

80

30
UL

90

20

sL
10

lS

lU

l'S
rS

uS

l''S

10

20

30

40

50

60

70

80

90

[%] Sand 632000 m

26

4.9

UK Soil Survey of England and Wales texture classification

To display a Soil Survey of England and Wales texture triangle (UK), type:
TT.plot( class.sys = "UK.SSEW.TT" )

10

Texture triangle: Soil Survey of England and Wales (UK)

20

90

40

70

Cl

60

60
2

50

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

SiCl

40

70

SaCl

30

80

SiClLo

ClLo
SaClLo

90

20

10

SaLo

SaSiLo

SiLo

LoSa
Sa

10

20

30

40

50

60

70

80

90

[%] Sand 602000 m

UK Soil Survey of England and Wales texture triangle has been built considering a silt - sand limit of 60meters.
See the table for soil texture classes symbols.
The reference used to digitize this triangle is Defra Rural Development
Service Technical Advice Unit 2006[9] (Technical Advice Note 52 Soil texture).

27

1
2
3
4
5
6
7
8
9
10
11

abbr
Cl
SaCl
SiCl
ClLo
SiClLo
SaClLo
SaLo
SaSiLo
SiLo
LoSa
Sa

name
Clay
Sandy clay
Silty clay
Clay loam
Silty clay loam
Sandy clay loam
Sandy loam
Sandy silt loam
Silt loam
Loamy sand
Sand

Table 9: Texture classes of the UK system / triangle

28

4.10

The Australian soil texture classification

To display an Autralian texture triangle, type:


TT.plot( class.sys = "AU.TT" )
Texture triangle: Autralia (AU)

90

[%] Clay 02 m

80

70

Cl

60

SiCl

ilt

]S
[%

50

20
2
m

40
SaCl
SiClLo
30

ClLo
SaClLo

20
Lo

SaLo

SiLo
10

LoSa

Sa

90

80

70

60

50

40

30

20

10

[%] Sand 202000 m

The Australian soil texture classification has been built considering a silt sand limit of 20meters.
See the table for soil texture classes symbols.

1
2
3
4
5
6
7
8
9
10
11

abbr
Cl
SiCl
SiClLo
SiLo
ClLo
Lo
LoSa
SaCl
SaClLo
SaLo
Sa

name
Clay
Silty clay
Silt clay loam
Silty loam
Clay loam
Loam
Loamy sand
Sandy clay
Sandy clay loam
Sandy loam
Sand

Table 10: Texture classes of the Australian system / triangle

29

There are probably small errors in the exact placement of some texture
classes vertices (expected to be 1 or 2% of the exact value), due to technical
difficulties for reproducing precisely this triangle (reproduced after both Minasny and McBratney 2001[20], and Holbeche 2008[14] (brochure Soil TextureLaboratory Method from soilquality.org.au 16 ).

16 texttthttp://soilquality.org.au

30

4.11

The Belgian soil texture classification

To display an Belgium texture triangle, type:


TT.plot( class.sys = "BE.TT" )
Texture triangle: Belgium (BE)

10

90

20
80

30
]
[%

70

00

nd

50

2
0

50

60

Sa

40

70

[%
]

50

y0
Cla

40
60
U

30

80

E
20

90

A
S

90

80

70

60

50

30

20

40

10

10

[%] Silt 250 m

The Belgian soil texture classification has been built considering a silt - sand
limit of 50meters.
See the table for soil texture classes symbols17 . The class names are given
in French and in Flemish.
1
2
3
4
5
6
7

abbr
U
E
A
L
P
S
Z

name
Argile lourde | Zware klei
Argile | Klei
Limon | Leem
Limon sableux | Zandleem
Limon sableux leger | Licht zandleem
Sable limoneux | Lemig zand
Sable | Zand

Table 11: Texture classes of the Belgian system / triangle

This texture triangle has been built after images from Defourny et al.[8] and
Van Bossuyt[30].
17 In classes 5, leger should be replaced by l
eger. R (and Sweave) can not display french
accents easily, and I found no easy trics for displaying them.

31

32

4.12

The Canadian soil texture classification

To display a Canadian texture triangle with English texture class abbreviations,


type:
TT.plot( class.sys = "CA.EN.TT" )
Texture triangle: Canada (CA)

90

80

[%] Clay 02 m

HCl
70

60

]S
[%

Cl

50

ilt

SiCl

50
2

SaCl

40
SiClLo

ClLo

30
SaClLo
20

SiLo
SaLo

10

LoSa

Si

Sa

90

80

70

60

50

40

30

20

10

[%] Sand 502000 m

For the same triangle with French texture class abbreviations type:
TT.plot( class.sys = "CA.FR.TT" )

33

Texture triangle: Canada (CA)

90

80

[%] Clay 02 m

ALo
70

60

]S
[%

50

2
ilt

ALi

0
5

AS

40
LLiA

LA

30
LSA
20

LLi
LS

10

SL

Li

90

80

70

60

50

40

30

20

10

[%] Sand 502000 m

The Canadian soil texture classification has been built considering a silt sand limit of 50meters (18 ; [1]).
See the table for soil texture classes symbols, in English:

1
2
3
4
5
6
7
8
9
10
11
12
13

abbr
HCl
SiCl
Cl
SaCl
SiClLo
ClLo
SaClLo
SiLo
L
SaLo
LoSa
Si
Sa

name
Heavy clay
Silty clay
Clay
Sandy clay
Silty clay loam
Clay loam
Sandy clay loam
Silty loam
Loam
Sandy loam
Loamy sand
Silt
Sand

Table 12: Texture classes of the Canadian (en) system / triangle


Or in French:
18 http://sis.agr.gc.ca/cansis/glossary/separates,_soil.html

34

1
2
3
4
5
6
7
8
9
10
11
12
13

abbr
ALo
ALi
A
AS
LLiA
LA
LSA
LLi
L
LS
SL
Li
S

name
Argile lourde
Argile limoneuse
Argile
Argile sableuse
Loam limono-argileux
Loam argileux
Loam sablo-argileux
Loam limoneux
Loam
Loam sableux
Sable loameux
Limon
Sable

Table 13: Texture classes of the Canadian (fr) system / triangle

A reference image for this texture triangle can be found in sis.agr.gc.ca


(not the one used for digitizing the triangle), and the boundaries have been
checked with those given on the same web-page [1].
19

19 http://sis.agr.gc.ca/cansis/glossary/texture,_soil.html#figure1

35

4.13

The ISSS soil texture classification

To display a ISSS20 texture triangle, type:


TT.plot( class.sys = "ISSS.TT" )

10

Texture triangle: ISSS

20

90

40

70
HCl

60

50

40

70

LCl
SiCl

SaCl

80

30

20
2

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

20

ClLo

SiClLo

90

SaClLo

10
LoSa

Lo

SaLo

SiLo

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 202000 m

The ISSS soil texture classification has been built considering a silt - sand
limit of 20meters.
See the table for soil texture classes symbols:
Many thanks to Wei Shangguan (School of geography, Beijing normal university) for providing the code of the ISSS triangle (using an article from Verheye
and Ameryckx 1984[33]).

20 ISSS:

International Soil Science Society. Now IUSS, International Union of Soil Science.
The ISSS soil texture classification / triangle should not be confused with the ISSS particle
size classification (See 2.1, p. 6)

36

1
2
3
4
5
6
7
8
9
10
11
12

abbr
HCl
SaCl
LCl
SiCl
SaClLo
ClLo
SiClLo
LoSa
Sa
SaLo
Lo
SiLo

name
heavy clay
sandy clay
light clay
silty clay
sandy clay loam
clay loam
silty clay loam
loamy sand
sand
sandy loam
loam
silt loam

Table 14: Texture classes of the ISSS system / triangle

37

4.14

The Romanian soil texture classification

To display a Romanian texture triangle, type:


TT.plot( class.sys = "ROM.TT" )

10

Texture triangle: SRTS 2003

20

90

80

40

70
AA

60

50

AL

TT

TP

70

TN

40

20
2

60

ilt

AP

50

]S
[%

[%
]

Cla
y0
2

30

AF

30
LL

LP

80

LN
20

10

90

SG+SM+SF

SS

UG+UM+UF

SP

NG+NM+NF

10

20

30

40

50

60

70

80

90

[%] Sand 202000 m

The Romanian soil texture classification has been built considering a silt sand limit of 20meters.
See the table for soil texture classes symbols:
Many thanks to Rosca Bogdan (Romanian Academy, Iasi Branch, Geography team) for providing the code of the Romanian triangle.
A right angled version of the triangle can be obtained by typing:
TT.plot(
class.sys = "ROM.TT",
blr.clock
= c(F,T,NA),
tlr.an
= c(45,90,45),
blr.tx
= c("SILT","CLAY","SAND"),
)
#

38

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

abbr
AF
AA
AP
AL
TP
TT
TN
LP
LL
LN
SP
SS
SG+SM+SF
UG+UM+UF
NG+NM+NF

name
argila fina
argila medie
argila prafoasa
argila lutoasa
lut argilo-prafos
lut argilos mediu
argila nisipoasa
lut prafos
lut mediu
lut nisipo-argilos
praf
lut nisipos prafos
lut nisipos
nisip lutos
nisip

Table 15: Texture classes of the Romanian system / triangle

Texture triangle: SRTS 2003

90

[%] Clay 02 m

80

AF

70
AA
60

AL

AP

d
an

]S
[%

50

TT

LN

LL

TP

TN

0
00
2
20

40

30
LP

20
SG+SM+SF

10

SS

UG+UM+UF

SP

NG+NM+NF

39

90

[%] Silt 220 m

80

70

60

50

40

30

20

10

4.15

The Polish soil texture classification

To display a Polish texture triangle (Systematyka gleb Polski, 1989, for nonalluvial soils), type:
TT.plot( class.sys = "PL.TT" )

10

Texture triangle: PL

20

90
i

30

80

40

gc
ip

60

50

gcp

pli

0
1

gsp

70

40

20

gs

60

ilt

50

]S
[%

[%
]

Cla
y0
2

70

gl

glp

gp

80

30

gpp

20
pgm

pgpm

pgl

90

plz

pglp

10
ps

psp

pl

plp

10

20

30

40

50

60

70

80

90

[%] Sand 1001000 m

NB: Due to encoding issues, the Polish triangle with be displayed with original
polish character under Windows and Linux systems only. For other platforms
(Mac, freeBSD) only latin character are used.
The Polish soil texture classification has been built considering a silt - sand
limit of 100meters.
See the table for soil texture classes symbols:
Many thanks to Wiktor Zelazny for providing the code of the Polish triangle
(and the Polish language translation).

40

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

abbr
i
ip
gc
gcp
gs
gsp
gl
glp
gp
gpp
pgm
pgpm
pgl
pglp
ps
psp
pl
plp
pli
plz

name
il wlasciwy
il pylasty
glina ciezka
glina ciezka pylasta
glina srednia
glina srednia pylasta
glina lekka silnie spiaszczona
glina lekka silnie spiaszczona pylasta
glina lekka slabo spiaszczona
glina lekka slabo spiaszczona pylasta
piasek gliniasty mocny
piasek gliniasty mocny pylasty
piasek gliniasty lekki
piasek gliniasty lekki pylasty
piasek slabogliniasty
piasek slabogliniasty pylasty
piasek lekki
piasek lekki pylasty
pyl ilasty
pyl zwykly

Table 16: Texture classes of the Polish system / triangle

41

4.16

Soil texture triangle with a texture classes color gradient

It is possible to have a nice color gradient (single hue, gradient of saturation


and value) on the background, by setting the option class.p.bg.col (logical)
to TRUE.
Example with the USDA and FAO soil texture triangles:
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles
TT.plot(
class.sys
= "USDA.TT",
class.p.bg.col = TRUE
)
#
TT.plot(
class.sys
= "FAO50.TT",
class.p.bg.col = TRUE
)
#
# Back to old parameters:
par(old.par)

10

20

m
Cla
y0

40
50

60

[%
]

70

80

90

50

60

30

90

0
5

80

t2

MF

20

10

30

[%] Sand 502000 m

40

50

60

80

70

M
C

90

10

20

30

40

60

50

70

80

90

[%] Sand 502000 m

20

10

Sil

Si

30

SaLo

VF

60

]
[%

0
5

SaLoSa

SiLo

40

t2

Lo

80

50

Sil

SiClLo

SaClLo

20

10

]
[%

SiCl
ClLo

90

70

70

Cl

60

50
40 SaCl
30

10

30

80

70

[%
]

20

90

Texture triangle: FAO/HYPRES

40

Cla
y0

Texture triangle: USDA

Example with the French Aisne and French GEPPA soil texture triangles:
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles
TT.plot(
class.sys
= "FR.AISNE.TT",
class.p.bg.col = TRUE
)
#
TT.plot(
class.sys
= "FR.GEPPA.TT",
class.p.bg.col = TRUE
)
#
# Back to old parameters:
par(old.par)
42

80

40

Ls

LL
90

80

50

60

70

80

70

60

50

Sl

La
Lsa

40

S
SS

30

LL

10

20

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Sal

Al

LAS

Sa

LM

LLS

20

SL

Als

AS

00

LMS

30

0
2
50

10

LS

A
As

10

SA

20

LA

60

10

LAS

LSA

AA

70

d
an
]S
[%

AL

80

40

0
5

AS

90

50

t2
Sil

40

90

ALO

60

50

]
[%

[%
]

70

30

[%] Clay 02 m

10

20

90

Texture triangle: GEPPA (FR)

30

Cla
y0

Texture triangle: Aisne (FR)

[%] Silt 250 m

Example with the UK (SSEW) and German (BK94) soil texture triangles:
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles
TT.plot(
class.sys
= "UK.SSEW.TT",
class.p.bg.col = TRUE
)
#
TT.plot(
class.sys
= "DE.BK94.TT",
class.p.bg.col = TRUE
)
#
# Back to old parameters:
par(old.par)

70
Cl

60

90

80

70

Lt2 Lt3 Tu2


Ls3
30 Su3
Sl3
Sl4Ls4 Lts
Tl
20
Su2
Sl2
10
St3
Ts4
Ts3
Ts2
Ss St2

90

80

70

60

50

40

30

20

10

10

Tt

SiLo

20

30

40

60

50

70

80

90

[%] Sand 602000 m

Tu3

0
00
2
63

SaSiLo

Uls Lu

SaLo

60

an

SaLoSa

Ut2
Ut3
Ut4
Tu4

Us

40

10

70

Su4Slu Ls2

60
2

SiClLo

ClLo

80

50

ilt

SiCl

40 SaCl
30
SaClLo
20

90 Uu

]S
[%

50

]S
[%

50

60

Texture triangle: Bodenkundliche Kartieranleitung 1994 (DE)

[%] Silt 263 m

10

30

lay

80

[%
]C

20

90

40

0
2
m

Texture triangle: Soil Survey of England and Wales (UK)

[%] Clay 02 m

Example with the Australian and Belgian soil texture triangle:


# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles
TT.plot(
class.sys
= "AU.TT",
class.p.bg.col = TRUE
)
#
43

TT.plot(
class.sys
= "BE.TT",
class.p.bg.col = TRUE
)
#
# Back to old parameters:
par(old.par)
Texture triangle: Belgium (BE)

90

]
[%

90

70

40
m
00
0
20
d5

20

80

10

90

70

60

50

40

20

10

[%] Sand 202000 m

30

Sa
n
[%
]

90

80

70

60

50

40

30

20

10

30

90

LoSa Sa

SiLo

10

40

70

0
2

20

50

80

SaCl
ClLo
SaClLo
Lo
SaLo

SiClLo

60

60

2
ilt

40

50

]S
[%

SiCl

30

80

Cl

60

y0
Cla

20

70

50

10

80

30

[%] Clay 02 m

Texture triangle: Autralia (AU)

[%] Silt 250 m

And finally the Canadian texture triangle (with English and French abbreviations):
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles
TT.plot(
class.sys
= "CA.EN.TT",
class.p.bg.col = TRUE
)
#
TT.plot(
class.sys
= "CA.FR.TT",
class.p.bg.col = TRUE
)
#
# Back to old parameters:
par(old.par)
Texture triangle: Canada (CA)

[%] Clay 02 m

[%] Clay 02 m

Texture triangle: Canada (CA)

90
80
70

HCl

60

LA

SaLo

LoSa Sa

LLi

10

LS

Li

SL

S
90

80

70

60

50

44

40

30

20

10

90

80

70

60

50

40

30

20

10

[%] Sand 502000 m

LSA
L

Si

AS
LLiA

20

L
SiLo

10

30

SaClLo

20

ALi

50
2

ClLo

60

ilt

SiClLo

ALo

40

50
2

30

70

50

ilt

SaCl

40

80

]S
[%

Cl

SiCl

]S
[%

50

90

[%] Sand 502000 m

4.17

Soil texture triangle with custom texture class colors

class.p.bg.col can also be used to provide custom background colors for each
classes of the texture triangle:
Example with the FAO soil texture triangles:
TT.plot(
class.sys
class.p.bg.col
)
#

= "FAO50.TT",
= c("red","green","blue","pink","purple")

40
50

60

50

60

10

MF

90

20

80

30

0
5

70

40

t2
Sil

]
[%

[%
]

10
VF

70

20

90

80

30

Cla
y0

Texture triangle: FAO/HYPRES

10

20

30

40

50

70

60

80

90

[%] Sand 502000 m

You can type TT.classes.tbl()[,1] to get the number and order of the
texture classes in the triangle.

Overplotting two soil texture classification systems

5.1

Case 1: Overplotting two soil texture classification


systems with the same geometry

Below is the code for plotting a French-Aisne texture triangle over a USDA
texture triangle:
# First plot the USDA texture triangle, and retrieve its
#
geometrical features, silently outputted by TT.plot
geo <- TT.plot(
class.sys
= "USDA.TT",
main
= "USDA and French Aisne triangles, overplotted"
)
#
# Then overplot the French Aisne texture triangle,
#
and customise the colors so triangles are well distinct.
TT.classes(
geo
= geo,
class.sys
= "FR.AISNE.TT",
# Additional "graphical" options
class.line.col = "red",
class.lab.col
= "red",
lwd.axis
= 2
)
#
45

10

USDA and French Aisne triangles, overplotted

20

90

40

70
ALO
Cl

60

0
5

50
SiCl

60

50

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

SaCl
A
ClLo

AS

AL
SiClLo

70

40

30
LAS

LSA

80

SaClLo
LA

Lo

SA

90

20

Sa S

SiLo
LMS

LS

SaLo

10

LM

SL

LoSa

Si
LL

LLS

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Beware that the result may not necessarily be very readable when printed,
in black and white. Consider to change the line type as well (option class.lty
= 2 for TT.classes) is you want a more printer-friendly output.

5.2

Case 2: Overplotting two soil texture classification


systems with different geometries

Below is the code to plot a French GEPPA texture triangle over a French Aisne
texture triangle. The code is in fact almost identical to the previous case:
# First plot the USDA texture triangle, and retrieve its
#
geometrical features, silently outputted by TT.plot
geo <- TT.plot(
class.sys
= "FR.AISNE.TT",
main
= "French Aisne and GEPPA triangles, overplotted"
)
#
# Then overplot the French Aisne texture triangle,
#
and customise the colors so triangles are well distinct.
TT.classes(
geo
= geo,
class.sys
= "FR.GEPPA.TT",
# Additional "graphical" options
class.line.col = "red",
class.lab.col
= "red",
lwd.axis
= 2
)
#

46

10

French Aisne and GEPPA triangles, overplotted

20

90

40

AA

70

ALO
60

50
50

0
5

60

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

40
A

AL

Als

70

As
AS

Al

LAS

LSA
20

SA
Sa

Sal

Lsa

LS
10

S
S

SL

SS

LAS

Sl

LA
La

LMS

L LM

Ls LLS

LL

LL

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

90

AS

80

30

Plotting soil texture data

6.1

Simple plot of soil texture data

First, lets create a table containing (dummy) soil texture data, (in %), as well
as dummy organic carbon content (in g.kg 1 , for later use):

1
2
3
4
5
6
7
8

# Create a dummy data frame of soil textures:


my.text <- data.frame(
"CLAY" = c(05,60,15,05,25,05,25,45,65,75,13,47),
"SILT" = c(05,08,15,25,55,85,65,45,15,15,17,43),
"SAND" = c(90,32,70,70,20,10,10,10,20,10,70,10),
"OC"
= c(20,14,15,05,12,15,07,21,25,30,05,28)
)
#
# Display the table:
my.text
CLAY SILT SAND OC
5
5
90 20
60
8
32 14
15
15
70 15
5
25
70 5
25
55
20 12
5
85
10 15
25
65
10 7
45
45
10 21

47

9
10
11
12

65
75
13
47

15
15
17
43

20 25
10 30
70 5
10 28

The columns names include CLAY, SILT and SAND, so they are explicit for
the TT.plot function. The code to display these soil texture data is:
TT.plot(
class.sys
tri.data
main
)
#

= "FAO50.TT",
= my.text,
= "Soil texture data"

10

Soil texture data

20

90

40

70

60

50

ilt

50

]S
[%

[%
]

Cla
y0
2

VF

30

80

60

50
2

m
70

40

20

80

30

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The option tri.data is a data frame containing numerical values. colnames(tri.data) must match with blr.tex options values (default c("CLAY","SILT","SAND")).
More columns can be provided, but are not used unless other options are chosen
(see below).

6.2

Bubble plot of soil texture data and a 3rd variable

It could be interesting to plot the organic carbon content on top of the soil
texture triangle. Bubble plots are good for this:
TT.plot(
class.sys
tri.data

= "none",
= my.text,

48

z.name
main
#

= "OC",
= "Soil texture triangle and OC bubble plot"

10

Soil texture triangle and OC bubble plot

20

90

70

40

60

50
50

60

0
5

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

m
70

40

80

30

20

90

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The option z.name is a character string, the name of the column in tri.data
that contains a 3rd variable to be plotted.
The 3rd variable is plotted with an expansion factor proportional to z.name
value. Low values have a small diameter and high values have a big diameter. To
re-enforce the visual effect, a single hue color gradient is added to the point background, with hight saturation and high colors value (bright) for low z.names
values, and low saturation and low colors value (dark) for high z.names values.
The function keeps good visual effect, even with a lot of values. Below is
a test using TT.dataset() function, that generate a (quick and dirty) dummy
soil texture datasets, with a 4th z variable (named Z), correlated to the texture
data.
rand.text
TT.plot(
class.sys
tri.data
z.name
main
)
#

<- TT.dataset(n=100,seed.val=1980042401)

=
=
=
=

"none",
rand.text,
"Z",
"Soil texture triangle and Z bubble plot"

49

Soil texture triangle and Z bubble plot

10

20

90

40

70

50

80

30

0
5

40

10

90

20

2
ilt
]S
[%

50

70

60

60

[%
]

Cla
y0
2

30

80

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

This function is primarily intended for exploratory data analysis or for rather
qualitative analysis, as it is difficult for the reader to know the real z.name
value of a point. It is nevertheless possible to add manually a legend, as in the
example below:
TT.plot(
class.sys
= "none",
tri.data
= my.text,
z.name
= "OC",
main
= "Soil texture triangle and OC bubble plot"
)
#
# Recompute some internal values:
z.cex.range <- TT.get("z.cex.range")
def.pch
<- par("pch")
def.col
<- par("col")
def.cex
<- TT.get("cex")
oc.str
<- TT.str(
my.text[,"OC"],
z.cex.range[1],
z.cex.range[2]
)
#
# The legend:
legend(
x
= 80,
y
= 90,
title
=
expression( bold('OC [g.kg'^-1 ~ ']') ),
50

legend
c(

= formatC(
min( my.text[,"OC"] ),
quantile(my.text[,"OC"] ,probs=c(25,50,75)/100),
max( my.text[,"OC"] )

),
format = "f",
digits = 1,
width
= 4,
flag
= "0"
), #
pt.lwd
= 4,
col
= def.col,
pt.cex
= c(
min( oc.str ),
quantile(oc.str ,probs=c(25,50,75)/100),
max( oc.str )
), #,
pch
= def.pch,
bty
= "o",
bg
= NA,
#box.col
= NA, # Uncomment this to remove the legend box
text.col
= "black",
cex
= def.cex
#

Soil texture triangle and OC bubble plot

OC [g.kg

05.0
10.8
15.0
22.0
30.0

10

20

90

30

80

Cla
y

0
2

70

40

50

ilt

50

]S
[%

[%
]

60

60

50
2

m
70

40

80

30

20

90

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

51

This code is obviously complicated, but it produces a smart legend. It is not


possible (or easy) to add an automatic legend to a plot, because the optimal
number of decimals may change from dataset to dataset, as well as the quantiles
displayed.

6.3

Heatmap and / or contour plot of soil texture data


and a 4th variable

Another way to explore a 4th variable is heatmap. The heatmap represent a


local average value (by inverse distance interpolation) of the 4th variable in the
form of a colored map.
Plotting a heatmap now follows 4 steps, that somehow works as sandwich
plots:
(1) Retrieve the geometrical parameters of the future plot with TT.geo.get()
function. It doesnt plot anything, but returns geometrical parameters
that will be used to determine the x-y grid on which calculating the inverse distance. A call to geo <- TT.plot() would also work.
(2) Calculate inverse weighted distances of the 4th variable (here Z) on
a regular x-y grid, using TT.iwd() function. It returns a grid with interpolated values.
(3) Plot this grid with the function TT.image() (or with TT.contour()).
This function is a wrapper for the image() (or TT.contour()) function,
adapted to triangle plots. The grid format is compatible with image() or
TT.contour(). TT.image() can have an option add = TRUE to plot the
image on top of an existing triangle plot.
(4) Add a standard triangle plot on to of the heatmap, using the standard
TT.plot() function (with add = TRUE). If plot has been called in step 1,
step 4 is not necessary, and the heatmap is plotted on top of the existing
triangle.

geo <- TT.geo.get()


#
iwd.res <- TT.iwd(
geo
= geo,
tri.data
= rand.text,
z.name
= "Z",
)
#
#
TT.image(
x
= iwd.res,
geo
= geo,
main
= "Soil texture triangle and Z heatmap"
)
#
#
TT.plot(

52

geo
grid.show
add
#

= geo,
= FALSE,
= TRUE #

<<-- important

10

Soil texture triangle and Z heatmap

20

90

30

80

40
60

50

ilt

50

]S
[%

[%
]

Cla
y0
2

VF
70

60

50
2

m
70

40

80

30

20

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

TT.iwd() has 3 important parameters:


(1) pow (default value 0.5) is the power used for the inverse weighted distance interpolation. Low values means strong smoothing, and vice versa;
(2) q.max.dist (default value 0.5) is used to determines the maximum
(Euclidian) distance of the points used to calculate interpolated values.
Data points located further than that distance are not used. q.max.dist
is the quantile of the Euclidian distance, so 0.5 means that points located
further that the 50% quantile of all Euclidian distances will not be used to
calculate a given grid value (notice that this is very experimental!). The
higher the value, the more points used to calculate the interpolated values
(and the stronger the smoothing);
(3) n is the number of x and y values used to calculate the interpolation
grid. The number of nodes in the grid is n2 .

TT.image() accepts most of the options existing in image().


The is no heatmap legend, but it is possible to add a contour plot to the
existing plot, in order to replace the color legend:

53

TT.image(
x
=
geo
=
main
=
)
#
#
TT.contour(
x
=
geo
=
add
=
lwd
=
)
#
#
TT.plot(
geo
grid.show
add
)
#

iwd.res,
geo,
"Soil texture triangle and Z heatmap"

iwd.res,
geo,
TRUE, # <<-- important
2

= geo,
= FALSE,
= TRUE #

<<-- important

10

Soil texture triangle and Z heatmap

20

90

30

80

40

11

60

50
12

10

60

50
2

10

ilt

50

]S
[%

[%
]

Cla
y0
2

VF
70

m
70

40
8
12

80

30
7

20

90

MF

10

C
6

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

TT.contour() accepts most of the options existing in contour().


Inverse Weighted Distance interpolation is not really state of the art statistics, but rather a visual way of exploring the data. Interpolation is NOT done
on a clay / silt / sand mesh, but rather on a x-y grid in the triangle. So data
density is not equal between clay, silt and sand. Moreover, the interpolator
might not be the most relevant one.

54

This function is only provided as experimental and it is susceptible to be


modified significantly in the future.

6.4

Two-dimensional kernel (probability) density estimation for texture data

The kde2d() function of the MASS package by W. N. Venables and B. D.


Ripley[32], for 2D kernel probability density estimate has been wrapped into
the function TT.kde2d() so it becomes usable with texture data and texture triangle. It returns an x-y-z list / grid object that can be plotted with TT.contour()
or TT.image().
The same sandwich plot structure as for inverse weight distance estimate
of a 4th variable is also valid for contour plot of probability density estimates:
geo <- TT.geo.get()
#
kde.res <- TT.kde2d(
geo
= geo,
tri.data
= rand.text
)
#
#
TT.contour(
x
= kde.res,
geo
= geo,
main
= "Probability density estimate of the texture data",
lwd
= 2,
col
= "red"
)
#
#
TT.plot(
tri.data
= rand.text,
geo
= geo,
grid.show
= FALSE,
add
= TRUE, # <<-- important
col
= "gray"
)
#

55

Probability density estimate of the texture data

10

20

90

80

30

5e05
1e04

0.00015

0.00025

0.00045

10

01
0.00

0
e

0.00035

05

5e

20

MF

90

80

30

70

60

4e

0
5

2
ilt
]S
[%

50

40

50

40

60

[%
]

Cla
y0
2

VF
70

1e0

5e05

2e

1e

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Using TT.image() would also work here.


As kde2d(), TT.kde2d() accepts a n option that determines the number
of values in the x and y axes (The total number of nodes is n2 ). The parameter
h from kde2d() has NOT been implemented into TT.kde2d(), and the default
calculation method is used.
Please note that the probability density is estimated on the x-y grid of the
plot, and NOT on the clay / silt / sand coordinates system. So a different plot
geometry may give a slightly different probability density estimate...

6.5

Contour plot of texture data Mahalanobis distance

The mahalanobis() function (part of the default R functions) has been wrapped
into the function TT.mahalanobis() so it becomes usable with texture data and
texture triangle. It returns an x-y-z list / grid object that can be plotted with
TT.contour() or TT.image().
Some authors[16] have recommended that the Mahalanobis distance should
be computed on the additive log-ratio transform of soil texture data in order
to take into account the fact the 3 texture classes are not independent random
variables (but rather compositional data). For this reason an option has been
added that transform the texture data by an additive log-ratio prior to the computation of the Mahalanobis distance (the default is no transformation of the
data). The log-ratio transformation code used here has been taken from the
chemometrics package[11] by Filzmoser and Varmuza (function alr()).

56

The same sandwich plot structure as for inverse weight distance estimate
of a 4th variable is also valid for contour plot of probability density estimates.
Below is a first example without texture transformation:
geo <- TT.geo.get()
#
maha <- TT.mahalanobis(
geo
= geo,
tri.data
= rand.text
)
#
#
TT.contour(
x
= maha,
geo
= geo,
main
= "Texture data Mahalanobis distance",
lwd
= 2,
col
= "blue"
)
#
#
TT.plot(
tri.data
= rand.text,
geo
= geo,
grid.show
= FALSE,
add
= TRUE, # <<-- important
col
= "gray"
)
#
Texture data Mahalanobis distance

10
90

20

12

60

MF

14

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

12

18

10

20

90

80

30

60

50
2

ilt

50

40

]S
[%

[%
]

70

0
2
Cla
y

VF

40

70

50

80

30

10

57

All the options of mahalanobis() are also available in TT.mahalanobis().


The option divisorvar is an integer that determines which texture classes
(number 1, 2 or 3 in css.names) is NOT used to calculate the Mahalanobis
distance (using the 3 texture classes crashes the mahalanobis() function).
If you want to compute the Mahalanobis distance on texture data transformed with an additive log-ratio, you can set the option alr = TRUE (default
= FALSE). The option divisorvar is then an integer used in the log-ratio
transformation of texture data,
alr(textureClassi ) = log10 (textureClassi /textureClassdivisorvar )
where i and divisorvar are index of css.names. The Mahalanobis distance is then computed on 2 of the 3 log-ratio transformed texture classes
(css.names[-divisorvar]).
Below is an example of Mahalanobis distance plot with log-ratio transformation:
geo <- TT.geo.get()
#
maha <- TT.mahalanobis(
geo
= geo,
tri.data
= rand.text,
alr
= TRUE # <<-- important
)
#
#
TT.contour(
x
= maha,
geo
= geo,
main
= "Texture data Mahalanobis distance",
lwd
= 2,
col
= "blue",
levels = c(0.5,1,2,4,8) # <<-- manually set. Otherwise
)
#
ugly plot
#
TT.plot(
tri.data
= rand.text,
geo
= geo,
grid.show
= FALSE,
add
= TRUE, # <<-- important
col
= "gray"
)
#

58

Texture data Mahalanobis distance

10

20

90
8

80

30

MF

0.5

20

90

80

30

10

0
5

50

70

60

2
ilt
]S
[%

[%
]

40

40

60

50

Cla
y0
2

VF
70

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

The Mahalanobis distances computed on a regular x-y grid have an extremely


skewed distribution, with a few very high values near the borders of the triangle. For this reason the automatic levels of the contour function fails to show
anything relevant, and it is recommended that the user manually set the levels,
as in the example.
Please notice that the TT.mahalanobis() has not been tested extensively for practical and theoretical validity.
Using TT.image() would also work here.

6.6

Plotting text in a texture triangle

As the text() function of R standard plot functions, TT.plot() is completed


by a TT.text() function that displays text into an existing texture triangle
plot. Its use is similar to TT.points(), apart that it has a labels, and a font
option, as the text() function. Below is a simple example:
# Display the USDA texture triangle:
geo
<- TT.plot(class.sys="USDA.TT")
# Create some custom labels:
labelz <- letters[1:dim(my.text)[1]]
labelz
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
# Display the text
TT.text(
59

tri.data
geo
labels
font
col
#

=
=
=
=
=

my.text,
geo,
labelz,
2,
"blue"

10

Texture triangle: USDA

20

90

80

30
40

i
60

Cl

50

ilt

50

]S
[%

[%
]

Cla
y0
2

j
70

60

50
2

l SiCl
h

ClLo

70

SaCl

40

SiClLo

30
e

20

80

SaClLo

c
k

90

Lo
SiLo
SaLo

10
a
Sa

LoSa

f Si

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

As for the text() function, it is also possible to set adj, pos and / or offset
parameters (not shown here).

Control of soil texture data in The Soil Texture Wizard

Several controls are done (internally) on soil texture data prior to soil texture
plots or soil texture classification:
Clay, silt and sand column names must correspond to the names given in
the option css.names (default to CLAY, SILT and SAND);
There should not be any negative values in clay, silt and sand (i.e. values
that lies outside the triangle). This control can be relaxed by setting the
option tri.pos.tst to FALSE;
All the row sums of the 3 texture classes must be equal to text.sum (generally 100, for 100%). In fact, (absolute) differences lower than text.sum

60

* text.tol are allowed (with text.tol option default to 1/1000, so textures sum must be between 99.9 and 100.1). This text can be relaxed by
setting tri.sum.tst to FALSE;
No missing values are allowed in the texture data (NA).

A test of the data can be conducted externally, using TT.data.test. An


error occur if the data dont pass the tests:
TT.data.test( tri.data = rand.text )
This function accepts options css.names, text.sum, text.tol, tri.sum.tst
and tri.pos.tst.

7.1

Normalizing soil texture data (sum of the 3 texture


classes)

If you have a texture data table with some rows where the sum of the 3 texture
classes is not 100%, but you know this is not due to errors in the data, you
may want to normalize the sum of the 3 texture classes to 100%. The function
TT.normalise.sum do that for you, and return a data table with normalised
clay, silt and sand values. The option residuals can be set to TRUE if you
want the residuals to be returned (initial row sum - final row sum):
res <- TT.normalise.sum( tri.data = rand.text )
#
# With output of the residuals:
res <- TT.normalise.sum(
tri.data
= rand.text,
residuals
= TRUE # <<-- default = FALSE
)
#
#
colnames( rand.text )
[1] "CLAY" "SILT" "SAND" "Z"
colnames( res ) # "Z" has been dropped
[1] "CLAY"
"SILT"
"SAND"
"residuals"
max( res[ , "residuals" ] )
[1] 2.842171e-14

7.2

Normalizing soil texture data (sum of X texture classes)

[function and section to be written]

Classify soil texture data: TT.points.in.classes()

The function TT.points.in.classes() classify a table of soil texture data


(tri.data) and returns a table where each row is one soil texture sample, and
each column a soil texture class (given the system class.sys). Values are 0
when the point is out of the class, 1 when in, 2 when on a polygon side
61

and 3 when on the polygon corner(s) (vertex / vertices) (As in the underying
function point.in.polygon() from the sp package). In the examples below
I will only show the results for the 5 first row of the dummy soil texture data
created above, with the FAO classification:
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "FAO50.TT"
)
#
VF F M MF C
[1,] 0 0 0 0 1
[2,] 2 2 0 0 0
[3,] 0 0 0 0 1
[4,] 0 0 0 0 1
[5,] 0 0 1 0 0
A major interest of the function resides in the fact that it is possible to use
another classication very easily, USDA in the xample below:
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "USDA.TT"
)
#
Cl SiCl SaCl ClLo SiClLo SaClLo Lo SiLo SaLo Si LoSa Sa
[1,] 0
0
0
0
0
0 0
0
0 0
0 1
[2,] 1
0
0
0
0
0 0
0
0 0
0 0
[3,] 0
0
0
0
0
0 0
0
1 0
0 0
[4,] 0
0
0
0
0
0 0
0
1 0
0 0
[5,] 0
0
0
0
0
0 0
1
0 0
0 0
The result can also be returned in a logical form with the option PiC.type =
"l" (for logical. default is n as numeric). Value is TRUE if the sample belong
to the class, and FALSE if it is outside the class. In case of a point located at
the border of two or more texture classes, several texture classes (columns) are
marked TRUE.
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "FAO50.TT",
PiC.type
= "l"
)
#
VF
F
M
MF
C
[1,] FALSE FALSE FALSE FALSE TRUE
[2,] TRUE TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE FALSE TRUE
[5,] FALSE FALSE TRUE FALSE FALSE
And finally, the results can be a vector of character, of the same length as the
number of soil samples, and containing the abbreviation of the texture class(es)
to which the sample belongs. In case of a sample lying on the border of two
classes, the classes abbreviation are concatenated (separated by a comma).

62

TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "FAO50.TT",
PiC.type
= "t"
)
#
[1] "C"
"VF, F" "C"
"C"

"M"

Notice that the second value lies between two classes, and that they are outputted separated by a comma.
The comma separator can be replaced by any character string, as in the
function paste(), with the option collapse:
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "FAO50.TT",
PiC.type
= "t",
collapse
= ";"
)
#
[1] "C"
"VF;F" "C"
"C"
"M"

Converting soil texture data and systems with


different silt-sand particle size limit

The Soil Texture Wizard comes with functions to transform soil textures data
from 1 particle sizes system (limits between the clay, silt and sand particles) to
another particle size system, with a log-linear transformation. For instance, it
is possible to convert a textures data table measured in a system that have a
silt / sand limit is 60m into a system that has a silt / sand limit is 50m.
It is important to keep in mind several limitations when transforming soil
texture data:
Transforming soil texture with a log-linear interpolation consider that
the cumulated particle size (mass) distribution is linear between two consecutive particle size classes limits, when plotted against a log transform
of the particle size;
Because of this, transforming soil texture is at best an approximation of what would be obtained with laboratory measurements;
The bigger the difference between two particle size limit used to interpolate
a new particle size limit, the more uncertain the estimation (= the bigger
the errors);
Because of this, the more particle size classes you have in the initial soil
texture data (i.e. the smaller the differences between 2 successive particle
size classes limits), the more precise the transformation.

63

Transforming soil texture data using a log-linear interpolation is not the


most precise method (especially if you have more than 3 particle size
classes). On the other hand, it is certainly the most simple method. See
Nemes et al. 1999 [22] for a comparison of different methods for soil texture
data transformation.

This package comes with 2 functions for texture transformations:


TT.text.transf(), that only works with 3 particle size classes, clay, silt
and sand. It can be used independently, for transforming a table of soil
texture data, but it is also embedded into TT.plot() and TT.points.in.classes() to allow transparent, on the fly transformation of soil texture data or soil texture triangles / classification.
TT.text.transf.X(), that works with 3 or more particle size classes. The
number of particle size classes in the input data do not need to be equal
to the number of particle size classes in the final system (output). It
is not embedded and not embeddable into TT.plot() and TT.points.in.classes(), and it is not doing as many data consistency tests as
TT.text.transf().

Of course, it is also possible to define your own texture transformation function. If this function works on clay, silt and sand, and if it has the same options
as TT.text.transf(), it can also be embedded in TT.plot() and TT.points.in.classes() by changing a simple option.
If your data have more than 3 particle size classes, you should
probably use TT.text.transf.X() instead of TT.text.transf().
The figure below / above illustrate how the log-linear interpolation works,
and why it is sometimes / often inaccurate.

64

80

Sand

60

real distribution?

40

new Silt

20

Silt

Clay

Cumulated particle size distribution [%]

100

Principle of particle size loglinear transformation

9.1

20
50
Particle size[ m] (log2scale)

2000

Transforming soil texture data (from 3 particle size


classes)

Here are the non transformed data (reminder):

1
2
3
4
5

my.text[1:5,]
CLAY SILT SAND
5
5
90
60
8
32
15
15
70
5
25
70
25
55
20

OC
20
14
15
5
12

Now the (dummy) data will be transformed, assuming that they have been
measured with a 63meters silt-sand particle size limit, and that we want them
to be with a 50meters silt-sand limit. Please dont forget this is not an exact
transformation, but rather an estimation:
TT.text.transf(
tri.data
base.css.ps.lim
dat.css.ps.lim
)
#
CLAY
SILT
SAND
1
5 4.665054 90.33495
2
60 7.464087 32.53591

= my.text[1:5,],
= c(0,2,50,2000),
= c(0,2,63,2000)
OC
20
14
65

3
4
5

15 13.995163 71.00484 15
5 23.325271 71.67473 5
25 51.315597 23.68440 12
Lets create a copy of the dummy data table, with new French columns names.

# Copy the data.frame


my.text.fr <- my.text
# Curent columns names:
colnames(my.text.fr)
[1] "CLAY" "SILT" "SAND" "OC"
# New columns names:
colnames(my.text.fr) <- c("ARGILE","LIMON","SABLE","CO")
It is also possible to transform it:

1
2
3
4
5

TT.text.transf(
tri.data
= my.text.fr[1:5,],
base.css.ps.lim = c(0,2,50,2000),
dat.css.ps.lim = c(0,2,63,2000),
css.names
= c("ARGILE","LIMON","SABLE")
)
#
ARGILE
LIMON
SABLE CO
5 4.665054 90.33495 20
60 7.464087 32.53591 14
15 13.995163 71.00484 15
5 23.325271 71.67473 5
25 51.315597 23.68440 12

As you can see, OC values are kept and returned untransformed in the
outputted data.frame.

9.2

Transforming soil texture data (from 3 or more particle size classes)

When more than 3 particle size classes are present in the dataset, it is sometimes
necessary (and anyway recommended) to use TT.text.transf.X() instead of
TT.text.transf(). But TT.text.transf.X() is not performing as much data
consistency checks as TT.text.transf(). In particular:
The option tri.data should be a data.frame with only soil texture data
(no additional extra columns should be present). It will not necessary bug
or warn if more data are provided (although there are good chances that
it bugs because the sum of textures is not 100%);
The columns in the tri.data data.frame should be in ascending order
of particle size. If the columns are provided in another order, it will not
bug or warn;
The length of the particle size classes limits should be equal to the number
of columns in tri.data + 1 (from the lower limit of the 1st class to the
upper limit of the upper class).

66

We need first to create a dummy dataset with more than 3 particle size
classes:
# Create a random fraction between 0 and 1
r.frac <- runif(n=dim(my.text)[1])
#
my.text4 <- cbind(
"CLAY"
= my.text[,"CLAY"],
"FINE_SILT"
= my.text[,"SILT"] * r.frac,
"COARSE_SILT"
= my.text[,"SILT"] * (1-r.frac),
"SAND"
= my.text[,"SAND"]
)
#
#
my.text4[1:5,]
CLAY FINE_SILT COARSE_SILT SAND
[1,]
5 1.993923 3.00607682
90
[2,]
60 7.983799 0.01620122
32
[3,]
15 2.907617 12.09238343
70
[4,]
5 10.414043 14.58595668
70
[5,]
25 34.866125 20.13387494
20
Transform this data frame, from a system where the silt - sand limit is at
63m to a system where the silt - sand limit is at 50m:

1
2
3
4
5

TT.text.transf.X(
tri.data
= my.text4[1:5,],
base.ps.lim = c(0,2,20,50,2000),
dat.ps.lim = c(0,2,20,63,2000)
)
#
C1
C2
C3
C4
5 1.993923 2.40058780 90.60549
60 7.983799 0.01293795 32.00326
15 2.907617 9.65671534 72.43567
5 10.414043 11.64802889 72.93793
25 34.866125 16.07847618 24.05540

Notice the differences in options name as compared to TT.text.transf().


Notice also that the columns names in the input data are not preserved in the
output data (There is not systematically a correspondence between input and
output).
As said before, the number of particle size classes in the input data do not
need to be identical to the number of particle size classes in the output:
TT.text.transf.X(
tri.data
= my.text4[1:5,],
base.ps.lim = c(0,2,50,2000),
dat.ps.lim = c(0,2,20,63,2000)
)
#

67

C1
C2
C3
1 5 4.394511 90.60549
2 60 7.996737 32.00326
3 15 12.564332 72.43567
4 5 22.062072 72.93793
5 25 50.944601 24.05540

9.3

Plotting and transforming on the fly soil texture data

It is possible to plot data on a triangle and transform them on the fly, if they
have been measured in another particle size system (classes sizes) as the triangle:
# First, plot the data without transformation:
geo <- TT.plot(
class.sys
= "FR.GEPPA.TT",
tri.data
= my.text,
col
= "red",
main
= "Transformed and untransformed data"
)
#
# Then, re-plot them with transformation:
TT.points(
tri.data
= my.text,
geo
= geo,
dat.css.ps.lim = c(0,2,63,2000),
css.transf
= TRUE,
col
= "blue",
pch
= 3
)
#

68

Transformed and untransformed data

90

80

[%] Clay 02 m

AA

70

60

50

]S
[%

d
an

0
2
50

40

00

As

Als
Al
30
AS

LAS

La

20
Sa

Sal

Lsa

10

Sl

LL

90

80

70

60

50

40

30

20

10

Ls

SS

[%] Silt 250 m

Notice that the dat.css.ps.lim and css.transf options could be used


directly with TT.plot() (not shown here).

9.4

Plotting and transforming on the fly soil texture triangles / classification

The example below shows how it is possible to project the UK soil texture
triangle in a particle size system that has 0, 2, 50 and 2000m as reference. The
background triangle (gray) is in fact NOT transformed, and plotted as it is,
without taking care of the real particle size limits (because the default value
of the css.transf option is FALSE). The second plot (red) is transformed as
it should have been (because the UK triangle has a 60m silt sand limit).
# Not transformed
geo <- TT.plot(
class.sys
= "UK.SSEW.TT",
base.css.ps.lim = c(0,2,50,2000),
main
=
"Dummy transformation of the UK texture triangle"
)
#
# Transformed
TT.classes(
geo
= geo,
class.sys
= "UK.SSEW.TT",
css.transf
= TRUE,
# Additional "graphical" options
class.line.col = "red",
69

class.lab.col
lwd.axis
class.lab.show
class.lty
#

=
=
=
=

"red",
2,
"none",
2

10

Dummy transformation of the UK texture triangle

20

90

40

70

Cl

60

50
2

50

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

SiCl

40

70

SaCl

30

80

SiClLo

ClLo
SaClLo

90

20

10

SaLo

SaSiLo

SiLo

LoSa
Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

We clearly see that clay content is unaffected, but there is a gap created
by the fact that 100% silt become less than 100% silt and some Sand (Particles
that were considered as silt in the original UK system become sand in the 50m
system) ! So the texture triangle is compacted toward the sand side.
In a second example we can show how to compare a USDA soil texture
triangle, and a UK soil texture triangle re-projected in the same particle size
system, 50m (while the UK triangle is based on a 60m limit):
# No transformation needed or stated
geo <- TT.plot(
class.sys
= "USDA.TT",
main
=
"USDA and transformed UK triangle, overplotted"
)
#
# Transformed
TT.classes(
geo
= geo,
class.sys
= "UK.SSEW.TT",
css.transf
= TRUE, # <<-- important
# Additional "graphical" options
70

class.line.col
class.lab.col
lwd.axis
class.lty
#

=
=
=
=

"blue",
"blue",
2,
2

USDA and transformed UK triangle, overplotted

10

20

90

40

70
Cl
Cl

60

50
SiClLo

ClLo

SiClLo

70

ClLo

SiCl

50
2

SiCl
SaCl
SaCl

40

60

ilt

50

]S
[%

[%
]

Cla
y0
2

30

80

SaClLo
SaClLo
20

80

30

90

Lo

SiLo
SaLo
SaLo

10

SaSiLo

SiLo

LoSa
LoSa

Si

Sa
Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Now another test where the background silt sand limit is 50meters and the
2nd triangle is said to have 20meters limit. Two USDA texture triangles. The
1st is not transformed (because it is not needed), while the 2nd is transformed:
# Untransformed
geo <- TT.plot(
class.sys
= "USDA.TT",
main
=
"(Dummy) transformation of the USDA texture triangle"
)
#
# Transformed
TT.classes(
geo
= geo,
class.sys
= "USDA.TT",
tri.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE, # <<-- important
# Additional "graphical" options
class.line.col = "blue",
class.lab.col
= "blue",
lwd.axis
= 2,
class.lty
= 2
71

10

(Dummy) transformation of the USDA texture triangle

20

90

40

70
Cl Cl

60

50
ClLo ClLo

70

40

SaCl

0
5

SiCl
SiCl
SaCl

60

50

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

SiClLo
SiClLo

30
SaClLo
Lo

Lo

90

20

80

SaClLo

SiLoSiLo
SaLo

10
LoSa

SaLo

LoSa

Sa

SiSi

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

Now another test with a right-angled triangle (the French GEPPA). The
background silt sand limit is 50meters and the 2nd triangle is said to have
20meters limit. The 1st is not transformed (because it is not needed), while
the 2nd is transformed:
geo <- TT.plot(
class.sys
= "FR.GEPPA.TT",
blr.tx
= c("SAND","CLAY","SILT"),
main
=
"(Dummy) transformation of the GEPPA texture triangle"
)
#
TT.classes(
geo
= geo,
class.sys
= "FR.GEPPA.TT",
tri.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE, # <<-- important
# Additional "graphical" options
class.line.col = "blue",
class.lab.col
= "blue",
lwd.axis
= 2,
class.lty
= 2
)
#

72

(Dummy) transformation of the GEPPA texture triangle

90

[%] Clay 02 m

80

AAAA

70

60

2
ilt

]S
[%

50

0
5

As
Als

40
As

Als

AlAl
30
AS
LaLa

LAS

LAS

Lsa

Lsa

AS

20

LL

Sal

Sal

Sa

Sa

10

S
Ls

LLLL

Sl

Sl
SS

SS
90

80

70

60

50

40

30

20

10

Ls

[%] Sand 502000 m

Now another test with the same triangle. The background silt sand limit is
fixed at 20meters, while the GEPPA triangle has a 50m silt sand limit. The
fist triangle is not transformed, while the second is transformed:
# Not transformed
geo <- TT.plot(
class.sys
= "FR.GEPPA.TT",
blr.tx
= c("SAND","CLAY","SILT"),
base.css.ps.lim = c(0,2,20,2000),
main
=
"(Dummy) transformation of the GEPPA texture triangle"
)
#
# Transformed
TT.classes(
geo
= geo,
class.sys
= "FR.GEPPA.TT",
css.transf
= TRUE, # <<-- important
# Additional "graphical" options
class.line.col = "blue",
class.lab.col
= "blue",
lwd.axis
= 2,
class.lty
= 2
)
#

73

(Dummy) transformation of the GEPPA texture triangle

90

[%] Clay 02 m

80

AA AA

70

60

2
ilt

]S
[%

50

0
2
m

40
As As
Als
Al

Als

Al

30
AS AS
La

La

LAS

LAS

20
Lsa Sal

Lsa
L

Sal

Sa Sa

10

S
LLLs

LL

Ls

Sl
SS SS
90

80

70

60

50

40

30

20

10

[%] Sand 202000 m

9.5

Sl

Classifying and transforming on the fly soil texture


data

It is possible to transform soil texture data when classifying them according to


a given soil texture classification21 .
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "USDA.TT",
dat.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE
# <<-- important
)
#
Cl SiCl SaCl ClLo SiClLo SaClLo Lo SiLo SaLo Si LoSa Sa
[1,] 0
0
0
0
0
0 0
0
1 0
0 0
[2,] 1
0
0
0
0
0 0
0
0 0
0 0
[3,] 0
0
0
0
0
0 0
0
1 0
0 0
[4,] 0
0
0
0
0
0 0
0
1 0
0 0
[5,] 0
0
0
0
0
0 0
1
0 0
0 0
Visualize the result (all data):
TT.plot(
class.sys
tri.data

= "USDA.TT",
= my.text,

21 And also the other way round: classifying soil texture data according to a transformed
soil texture triangle / classification, but this is NOT recommended, for results consistency

74

dat.css.ps.lim
css.transf
col
#

= c(0,2,20,2000),
= TRUE, # <<-- important
= "red"

10

Texture triangle: USDA

20

90

30

80

40

Cl
60

]S
[%

50

[%
]

Cla
y0
2

70

ilt

50

60

50
2

SiCl

ClLo

70

SaCl

40

SiClLo

SaClLo

20

80

30

90

Lo
SiLo

SaLo

10
LoSa

Si

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

But dont do (the texture triangle is transformed, not the data, and that is
not good at all):
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "USDA.TT",
dat.css.ps.lim = c(0,2,20,2000),
base.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE
)
#
Cl SiCl SaCl ClLo SiClLo SaClLo Lo SiLo SaLo Si LoSa Sa
[1,] 0
0
0
0
0
0 0
0
0 0
0 1
[2,] 1
0
0
0
0
0 0
0
0 0
0 0
[3,] 0
0
0
0
0
0 0
0
1 0
0 0
[4,] 0
0
0
0
0
0 0
0
1 0
0 0
[5,] 0
0
0
0
0
0 0
0
0 0
0 0
Visualize the difference (all data) and you will understant why doing this
causes some problems:
TT.plot(
class.sys

= "USDA.TT",
75

tri.data
dat.css.ps.lim
base.css.ps.lim
css.transf
col
#

=
=
=
=
=

my.text,
c(0,2,20,2000),
c(0,2,20,2000),
TRUE,
"red"

10

Texture triangle: USDA

20

90

30

80

40

Cl
60

50

ilt

50

60

20
2

SiCl
SaCl
ClLo

70

40

]S
[%

[%
]

Cla
y0
2

70

SiClLo

SaClLo

20

80

30

90

Lo
SiLo

SaLo

10
Sa

LoSa

Si

10

20

30

40

50

60

70

80

90

[%] Sand 202000 m

Some points lie outside the transformed soil texture classification, so they
apparently dont belong to any class... Reason why it is better to transform soil
texture data rather than soil texture classification / triangle.

9.6

Using your own custom transformation function when


plotting or classifying soil texture data

The TT.text.transf() function has been introduced a little earlier in this document. The function is transforming a data.frame containing soil texture data
into another data.frame, containing soil texture data estimated in another particle size system.
This function is also the underlying function used by TT.plot() and TT.points.in.classes() when transforming texture data on the fly.
You may well create an alternative function to TT.text.transf(),
that fits better your requirements, and willing to use it also when plotting or classifying data with TT.plot() or TT.points.in.classes(). It is
possible by changing the option text.transf.fun of TT.plot() or TT.points.in.classes(). This option is a character string naming the function to use
76

when transforming data on the fly. The function must accept the same arguments / options as TT.text.transf() (to see them, type formals(TT.text.transf)), even if some of them are in fact not used by your own function (it is just there
for compatibility). On the other hand, TT.text.transf() has 2 unused options slots, trsf.add.opt1 and trsf.add.opt2 that you may use in your own
function if needed (as these options slots are also ready for use in TT.plot()
and TT.points.in.classes()).
Here is a simple example:
# Create a new function, in fact the copy of TT.text.transf()
TT.text.transf2 <- TT.text.transf
# Imagine some changes in TT.text.transf2...
# Use your new function (will give identical results)
TT.points.in.classes(
tri.data
= my.text[1:5,],
class.sys
= "USDA.TT",
dat.css.ps.lim = c(0,2,20,2000),
base.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE,
text.transf.fun = "TT.text.transf2" # <<-- important
)
#
Cl SiCl SaCl ClLo SiClLo SaClLo Lo SiLo SaLo Si LoSa Sa
[1,] 0
0
0
0
0
0 0
0
0 0
0 1
[2,] 1
0
0
0
0
0 0
0
0 0
0 0
[3,] 0
0
0
0
0
0 0
0
1 0
0 0
[4,] 0
0
0
0
0
0 0
0
1 0
0 0
[5,] 0
0
0
0
0
0 0
0
0 0
0 0
Of course it works with TT.plot():
TT.plot(
class.sys
= "USDA.TT",
tri.data
= my.text,
dat.css.ps.lim = c(0,2,20,2000),
base.css.ps.lim = c(0,2,20,2000),
css.transf
= TRUE,
col
= "red",
text.transf.fun = "TT.text.transf2", # <<-- important
main
=
"Test of a (dummy) new transformation function"
)
#

77

10

Test of a (dummy) new transformation function

20

90

30

80

40

Cl
60

50
50

60

0
2

SiCl
SaCl
ClLo

70

40

2
ilt
]S
[%

[%
]

Cla
y0
2

70

SiClLo

SaClLo

20

90

Lo

SiLo

SaLo

10
Sa

LoSa

Si

10

20

30

40

50

60

70

80

90

[%] Sand 202000 m

10

80

30

Customize soil texture triangles geometry

Behind the ability of The soil texture wizard package to plot seemlessly any soil
texture classification system lies a system that disconnect soil texture class
boundaries (expressed as 3D volumes, whose submit coordinates are expressed
in clay / silt / sand proportion) and soil texture triangle geometry, where
soil texture values are projected in a plane (as points, or 2D polygons).
The soil texture wizard package allows to change:
Clay, Silt and Sand locations in the bottom, left and right axis;
Triangle vertices angles;
Direction of the axis (Clockwise, Anticlockwise or neutral).

All angles combinations are allowed, provided they sum to 180 degrees. Nevertheless only 60 / 60 / 60 degrees or one 90 degrees together with two 45 degrees
are recommended for obtaining smart plots (and correct anti-allysing).
Only 4 combinations of axis directions are allowed (and, as far as I know,
geometrically possible):
Full anticlockwise directions;
Full clockwise direction;

78

Bottom anticlockwise, left clockwise, and right neutral (inside). This is


the best presentation for triangles with a 90 degrees angle on the left, but
other angles are allowed.
Bottom clockwise, left neutral (inside), and right anticlockwise. This is
the best presentation for triangles with a 90 degrees angle on the right,
but other angles are allowed.

10.1

Customise angles

Below is a code example to project the USDA soil texture triangle using 90 and
45 / 45 angles:
TT.plot(
class.sys
tlr.an
main
)
#

= "USDA.TT",
= c(45,90,45),
= "Re-projected USDA triangle (angles)"

10

Reprojected USDA triangle (angles)

20

90

40

70
Cl

50

60

ilt

]S
[%
50
2

50

40

60

SiCl
SaCl

ClLo

70

[%] Clay 02 m

30

80

SiClLo

30
80

SaClLo
20

90

Lo

SiLo
SaLo

10
LoSa

Si

Sa

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

the option tlr.an accept a vector of numerical, for the Top, Left and Right
ANgles respectively.
the option main accept charcter string, for the plot title. If set to NA, no title
is plotted, and the graph is enlarged a bit.
Notice that this triangle has NOT the same geometry as the german system,
although it has the same angles (the axis directions are different, and clay silt
and sand are carried by different axis).
79

10.2

Customize texture class axis

Below is a code example to project the French Aisne soil texture triangle, with
clay at the bottom, silt on the left and sand on the right:
TT.plot(
class.sys
blr.tx
main
)
#

= "FR.AISNE.TT",
= c("CLAY","SILT","SAND"),
= "Re-projected French Aisne triangle (axis)"

Reprojected French Aisne triangle (axis)

10
90

20

LL

80

70

Sil

t2

5
0

LA

40

30

LM

LMS

LLS

AL

]S
[%

50

[%
]

60

60

00

20
0

LS
40

d5

an

LAS

50

70

LSA
30

80

SL
20

90

ALO

SA
10

AS

10

20

30

40

50

60

70

80

90

[%] Clay 02 m

The option blr.tx accept a vector of character strings. The values of the
vector indicates which texture class should be drawn for the Bottom, Left and
Right TEXtures; respectively.
The option blr.tx should not be confused with the option css.names, presented below (Internationalization), that defines the (columns) names taken
by clay, silt and sand (respectively) in the data.frame passed to tri.data.
The option blr.tx should not be confused with the option css.lab, presented below (Internationalization), that defines the names (or expressions)
displayed for clay, silt and sand axis labels / titles.

10.3

Customise axis direction

Below is a code example to project the FAO soil texture triangle, with the
bottom axis anticlockwise, the left axis clockwise and the right axis neutral
(inside).
80

TT.plot(
class.sys
blr.clock
main
)
#

= "FAO50.TT",
= c(FALSE,TRUE,NA),
= "Re-projected FAO triangle (axis directions)"

Reprojected FAO triangle (axis directions)

90

80

60

[%
]

Cla
y0
2

VF
70

]
[%

50

t2

Sil

0
5

40

30

20

MF

10

90

80

70

60

50

40

30

20

10

[%] Sand 502000 m

the option blr.clock accept a vector of boolean (TRUE / FALSE) as argument for bottom direction (here clock = FALSE), left (clock = FALSE) and
right (clock = NA). The NA value is used for the neutral case.

10.4

Customise everything: plot The French GEPPA classification in the French Aisne triangle

Below is a French GEPPA soil texture triangle plotted as a USDA or FAO or


French Aisne soil texture triangle, that is with custom angles, axis directions
and clay silt sand positions on the axis:
TT.plot(
class.sys
tlr.an
blr.tx
blr.clock
main
)
#

=
=
=
=
=

"FR.GEPPA.TT",
c(60,60,60),
c("SAND","CLAY","SILT"),
c(TRUE,TRUE,TRUE),
"Fully re-projected GEPPA triangle"

81

10

Fully reprojected GEPPA triangle

20

90

AA

40

70

60

50
50

0
5

60

2
ilt
]S
[%

[%
]

Cla
y0
2

30

80

As

Als

70

40
Al

AS

LAS

80

30
La

Sa

Sal

10

Lsa

S
Sl

SS

Ls

LL

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

10.5

90

20

Miscellaneous: Different triangle geometry, but same


projected classes

I once found an illustration on a website showing a USDA and a French Aisne


soil texture triangle displayed together, but with a different triangle geometry
than the usual one. The surprise was that although the triangle geometry was
different, the texture classes shapes (i.e. inside the triangle) looked exactly the
same as the standard display. Here is a practical example (not an explanation
of this strange phenomenon!):
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different geometries:
TT.plot( class.sys = "USDA.TT" )
TT.plot(
class.sys
= "USDA.TT",
blr.tx
= c("SILT","SAND","CLAY"),
blr.clock
= c(FALSE,FALSE,FALSE),
main
= "USDA triangle with a different geometry"
)
#
# Back to old parameters:
par(old.par)

82

SiLo

SaLo

80

70

60

Si

50

30

20

SaLoSa

30

10

90

m
00
0
20
d5
Sa
n

SiClLo

20

Lo

10

90

[%
]

50

60

50
40

40

10

20
30

70

80

40

y0
Cla

60

10

20

30

40

60

50

70

80

90

11.1

SaCl
ClLo

90

Si

[%] Sand 502000 m

11

SiLo

SaLo

60

SaClLo

80

SaLoSa

70

SiCl

70

Lo

20

10

SiClLo

SaClLo

0
5

ClLo

t2
Sil

30

SiCl

]
[%

50
40 SaCl

80
Cl

50

60

90

20

Cl

40

Cla
y0

30

80

70

[%
]

]
[%

90

USDA triangle with a different geometry

10

Texture triangle: USDA

[%] Silt 250 m

Internationalization: title, labels and data


names in different languages
Choose the language of texture triangle axis and title

The TT.plot() function comes with a lang option (lang for language) that
allows to plot texture triangles with a title and axis labels in other languages
than English (the default).
Here is a first example with French (lang = "fr") and German (lang =
"de"):
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "fr"
)
#
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "de"
)
#
# Back to old parameters:
par(old.par)

83

Bodenartendiagramm: GEPPA (FR)

90

[%] Ton 02 m

[%] Argile 02 m

Triangle de texture: GEPPA (FR)

80
70

AA

60

S
SS

Lsa

Sl

Ls

10
LL

Sal

S
SS

Sl

La
Lsa

Ls

LL
90

80

70

60

50

40

30

20

[%] Limon 250 m

Al

LAS

Sa

10

90

80

70

60

50

40

30

20

10

20

Als

AS

Sal

30

00

Sa

La

A
As

0
2
50

10

Al

LAS

AA

60

40

AS

70

50

00

20

Als

0
2
50

30

A
As

le
ab
]S
[%

40

80

d
an
]S
[%

50

90

[%] Schluff 250 m

A second example with Spanish (lang = "es"), and Italian (lang = "it"):
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "es"
)
#
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "it"
)
#
# Back to old parameters:
par(old.par)
Triangolo della tessitura: GEPPA (FR)
[%] Argilla 02 m

[%] Arcilla 02 m

Triangulo de textura: GEPPA (FR)

90
80
70

AA

60

S
SS

Sl

Ls

LL
90

80

70

60

50

40

30

20

La
Lsa

Sal

10

90

80

70

60

50

40

30

20

10

[%] Limo 250 m

10

Sa

00

LL

LAS

0
2

Ls

50

Al

Sl

Lsa

20

Als

AS

bi

S
SS

30

A
As

ab

Sal

La

Sa

Al

LAS

0
00
2

10

AS

AA

60

40

50

Als

na
re

20

As

70

50

]A

30

[%

40

80

]S
[%

50

90

[%] Limo 250 m

And a 3rd example with Dutch (lang = "nl") and Flemish (lang = "fl")
or, to be more exact, with the terms used on the Dutch texture triangle and on
the Flemish version of the Belgian texture triangle.
# Set a 2 by 2 plot matrix:
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
84

lang
= "nl"
)
#
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "fl"
)
#
# Back to old parameters:
par(old.par)
Textuurdriehoek: GEPPA (FR)

90

[%] Klei 02 m

[%] Lutum 02 m

Textuurdriehoek: GEPPA (FR)

80
70

AA

60

10
LL

Sa

Sal

S
SS

Sl

La
Lsa

Ls

LL
90

80

70

60

50

40

30

20

10

90

80

70

60

50

40

30

20

10

[%] Silt 250 m

Al

LAS

Ls

20

Als

AS

A
As

00

Lsa

Sl

30

Sal

S
SS

La

Sa

40

2
50

LAS

AA

60

d
an
]Z

AS

Al

00

10

Als

70

50

2
50

20

As

d
an
]Z

30

[%

40

80

[%

50

90

[%] Leem 250 m

A 4th example in Swedish (lang = "se") and in Romanian (lang = "ro"):


# Set a 2 by 2 plot matrix (for size):
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "se"
)
#
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "ro"
)
#
# Back to old parameters:
par(old.par)
Diagrama triunghiulara a texturii: GEPPA (FR)
[%] Argila 02 m

[%] Ler 02 m

Texturtriangel: GEPPA (FR)

90
80
70

AA

60

LL

Sal

S
SS

Sl

Ls

LL
90

80

70

60

50

85

La
Lsa

40

30

20

10

90

80

70

60

50

40

30

[%] Silt 250 m

Sa

10

Al

LAS

Ls

Als

AS

00
2
50

20

As

ip

Sl
20

10

Lsa

30

is

Sal

S
SS

La

]N

Sa

40

10

Al

LAS

AA

60
50

0
00
2
50

Als

AS

70

20

As

an

30

]S
[%

40

80

[%

50

90

[%] Praf 250 m

The polish language can be obtained by typing lang = "pl" on all platforms
by Mac.
And finally in English, the default language (lang = "en"):
# Set a 2 by 2 plot matrix (for size):
old.par <- par(no.readonly=T)
par("mfcol" = c(1,2),"mfrow"=c(1,2))
# Plot the triangles with different languages:
TT.plot(
class.sys
= "FR.GEPPA.TT",
lang
= "en"
)
#
# Back to old parameters:
par(old.par)

[%] Clay 02 m

Texture triangle: GEPPA (FR)

90
80
70

AA

60
50

Sal

S
SS

Sl

La
Lsa

Ls

LL
90

80

70

60

50

40

30

20

10

Sa

00

10

Al

LAS

0
2
50

Als

AS

20

As

an

30

]S
[%

40

[%] Silt 250 m

Please report any mistakes in these translations. Please dont hesitate to


send me new translations in other languages. This option is easily extensible.

11.2

Use custom (columns) names for soil texture data

The dummy data table with french names can be displayed, but the option
css.names (for Clay, Silt, Sand NAMES) must be specified, as a vector of
character string, corresponding to the columns names of tri.data. Notice
that the order of css.names is NOT NECESSARILY the order of
tri.data columns names, so css.names == colnames(my.text.fr) would
NOT always be true (although it is true here).
TT.plot(
tri.data
class.sys
css.names
)
#

= my.text.fr,
= "FAO50.TT",
= c("ARGILE","LIMON","SABLE")

86

10

Texture triangle: FAO/HYPRES

20

90

40

70

60

50
50

60

0
5

2
ilt
]S
[%

[%
]

Cla
y0
2

VF

30

80

m
70

40

20

80

30

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

You can see that the column names ARGILE, LIMON and SABLE do not
appear on the texture triangle plot. There is always a clear separation between the characteristics of the texture classification, the characteristics of the
soil texture data provided, and the characteristics of the soil texture triangle
plot/presentation. This is necessary for making different systems compatible.

11.3

Use custom labels for the axis

It is also possible to use custom labels for the triangle axis. The option css.lab
accept a vector (3) of character string, or a vector of expressions, for Clay, Silt
and Sand LABels respectively (in that order, no matter the texture triangle
system used. The function automatically places the good label on the good
axis).
TT.plot(
tri.data
= my.text.fr,
class.sys
= "FAO50.TT",
css.names
= c("ARGILE","LIMON","SABLE"),
css.lab
= c("l'argile [%]","Le limon [%]","Le sable [%]"),
main
=
"A texture triangle with (dummy) custom axis names"
)
#

87

10

A texture triangle with (dummy) custom axis names

20

90

VF

30

80

%]

60

50

Le

l'a
rgi
le
[

40

70

60

%]

n[

o
lim

50

70

40

20

80

30

90

MF

10

10

20

30

40

50

60

70

80

90

Le sable [%]

The use of expressions allows a finer customization of the axis labels, as for
any R plot:
TT.plot(
tri.data
= my.text.fr,
class.sys
= "FAO50.TT",
css.names
= c("ARGILE","LIMON","SABLE"),
css.lab
= expression(
bold(sqrt('Argile'^2)~'[%]'),
bold(sqrt('Limon'^2)~'[%]'),
bold(sqrt('Sable'^2)~'[%]')
), #
main
=
"A texture triangle with (dummy) custom axis names"
)
#

88

10

A texture triangle with (dummy) custom axis names

20

90

VF

30

80

Ar
gil
e2

40

[%

70

60

on

50

60

[%

Lim

50

70

40

20

80

30

90

MF

10

10

20

12

30

40

50

60

70

80

90

Sable2 [%]

Checking the geometry and classes boundaries of soil texture classifications

The Soil Texture Wizard comes with several functions that helps to retrieve
information about the geometry and classes boundaries of soil texture classifications, and thus to check by yourself that they are correct.

12.1

Checking the geometry of soil texture classifications

Below is a simple example of the way to retrieve the geometry of a given texture
triangle (as it is implemented in the The Soil Texture Wizard):
# Fisrt, retrieve all the data about
#
the USDA texture triangle
tmp <- TT.get("USDA.TT")
# It is not displayed here because it is to big
#
The list names are:
names(tmp)
[1] "main"
"tt.points"
"tt.polygons"
"blr.clock"
[6] "blr.tx"
"base.css.ps.lim" "tri.css.ps.lim" "unit.ps"
[11] "text.sum"
# If we drop "tt.points" and "tt.polygons", that will be
#
presented later, the list size is more reasonable
tmp[ !names(tmp) %in% c("tt.points","tt.polygons") ]

89

"tlr.an"
"unit.tx"

$main
[1] "USDA"
$blr.clock
[1] TRUE TRUE TRUE
$tlr.an
[1] 60 60 60
$blr.tx
[1] "SAND" "CLAY" "SILT"
$base.css.ps.lim
[1]
0
2
50 2000
$tri.css.ps.lim
[1]
0
2
50 2000
$unit.ps
bold(mu) * bold("m")
$unit.tx
bold("%")
$text.sum
[1] 100
Most of the lists names correspond to TT.plot()s options that have been
presented earlier in the document.

12.2

Checking classes names and boundaries of soil texture classifications

The function TT.classes.tbl() returns a table with information about each


soil texture class of a given soil texture classification / triangle:
# Retrieve and save the table:
tmp2 <- TT.classes.tbl( class.sys = "FAO50.TT" )
# Display the first part:
tmp2[,1:2]
abbr name
[1,] "VF" "Very fine"
[2,] "F" "Fine"
[3,] "M" "Medium"
[4,] "MF" "Medium fine"
[5,] "C" "Coarse"
# Then display the last column (and the 1st again):
tmp2[,c(1,3)]
abbr points
[1,] "VF" "2, 1, 3"
90

[2,]
[3,]
[4,]
[5,]

"F"
"M"
"MF"
"C"

"4, 2, 3, 6"
"7, 4, 5, 11, 10, 8"
"11, 5, 6, 12"
"9, 7, 8, 10"

The 1st column is the classes abbreviation, the 2nd column is the classes
full name (in the original language), and the 3rd class contains a list of vertices
numbers, separated by a comma. These vertices are those who compose the
class polygon.
But the vertices numbers are of course not self explicit. For this reason,
another function, TT.vertices.tbl(), extracts the vertices coordinates (as clay
silt and sand content) from the triangle definition:
TT.vertices.tbl( class.sys = "FAO50.TT" )
points CLAY SILT SAND
1
1 1.00 0.00 0.00
2
2 0.60 0.00 0.40
3
3 0.60 0.40 0.00
4
4 0.35 0.00 0.65
5
5 0.35 0.50 0.15
6
6 0.35 0.65 0.00
7
7 0.18 0.00 0.82
8
8 0.18 0.17 0.65
9
9 0.00 0.00 1.00
10
10 0.00 0.35 0.65
11
11 0.00 0.85 0.15
12
12 0.00 1.00 0.00
The points number outputted by TT.classes.tbl() logically correspond
to those outputted by TT.vertices.tbl().
Finally, as it is difficult to visualize the position of each vertex with just a
table, the function TT.vertices.plot() completes the two presented above, by
plotting the vertices position and numbers on top of a texture triangle (preferable the same as the one you are actually checking!):
geo <- TT.plot(
class.sys
=
main
=
)
#
TT.vertices.plot(
geo
=
class.sys
=
col
=
cex
=
font
=
)
#

"FAO50.TT",
"Vertices numbers. USDA texture triangle"

geo,
"FAO50.TT",
"red",
2,
2

91

Vertices numbers. USDA texture triangle

10

20

90

30

80

40
60

3
50

50

60

0
5

2
ilt
]S
[%

[%
]

Cla
y0
2

VF
70

40

70

80

30

MF

90

20

10

10

11
10

20

30

40

50

60

70

80

90

[%] Sand 502000 m

12

Many TT.vertices.plot() options are shared with TT.text(), which an


the underlying function of the first.

13

Adding your own, custom, texture triangle(s)

As said in the introduction, the idea behind The Soil Texture Wizard is to be
able to display any soil texture triangle / classification in any triangle geometry.
As there are much more texture classification systems than those implemented in The Soil Texture Wizard, the function TT.add() is there to add
any texture triangle to the existing list (your home made texture triangles).
In the example below, we will (1) extract and save the definition of the FAO50
texture triangle, (2) change the silt sand limit of the saved triangle definition
from 50m to 63m, and (3) load the new texture triangle into the existing
list of triangle. There, it will be saved and usable as any texture triangle (at
least until R is shut down).
# Step 1
FAO63 <- TT.get("FAO50.TT")
#
# Visualize the data that will be modified
FAO63[[ "base.css.ps.lim" ]]
[1]
0
2
50 2000
FAO63[[ "tri.css.ps.lim" ]]
92

[1]
0
2
50 2000
#
# Step 2
FAO63[[ "base.css.ps.lim" ]][3] <- 63
FAO63[[ "tri.css.ps.lim" ]][3] <- 63
#
# Step 3: Load the new texture triangle
TT.add( "FAO63.TT" = FAO63 )
This (not so) new texture triangle is now usable as any other in the initial
list:
TT.plot(
class.sys
main
)
#

= "FAO63.TT",
= "Modified FAO soil texture triangle"

10

Modified FAO soil texture triangle

20

90

30

80

40
60

50

ilt

50

]S
[%

[%
]

Cla
y0
2

VF
70

60

63
2

m
70

40

80

30

20

90

MF

10

10

20

30

40

50

60

70

80

90

[%] Sand 632000 m

If you consider creating a completely new triangle, you will need to copy /
imitate the structure of existing texture triangle definitions.
This definition is a list of parameters:
# Get the definition of the FAO50 texture triangle
FAO50 <- TT.get( "FAO50.TT" )
#
# Check its class (list)
class( FAO50 )
93

[1] "list"
#
# Check its parameters names
names( FAO50 )
[1] "main"
"tt.points"
"tt.polygons"
[6] "blr.tx"
"base.css.ps.lim" "tri.css.ps.lim"
[11] "text.sum"
#
# Check its parameters class
for( i in 1:length(FAO50) )
{
#
print(
paste(
names( FAO50 )[i],
class( FAO50[[i]] ),
sep = ": "
)
#
)
#
}
#
[1] "main: character"
[1] "tt.points: data.frame"
[1] "tt.polygons: list"
[1] "blr.clock: logical"
[1] "tlr.an: numeric"
[1] "blr.tx: character"
[1] "base.css.ps.lim: numeric"
[1] "tri.css.ps.lim: numeric"
[1] "unit.ps: call"
[1] "unit.tx: call"
[1] "text.sum: numeric"

"blr.clock"
"unit.ps"

All elements are (probably) self explicit, or have been presented earlier in
the document (as options of TT.plot() for instance), except for tt.points and
tt.polygons.
tt.points is a 3 column data.frame, with columns names CALY SILT and
SAND, that gives the clay, silt and sand coordinates of all the vertices in the
triangles. Rows numbers corresponds to the official vertex number. Vertices
are unique, they can not be repeated, even if they are used in several classes
definition / polygon.
tt.polygons is a list. Each element of the list corresponds to one texture
class. The name of each element of the list is the texture class abbreviation.
Then, each element of the list (i.e. each class) itself contains a list, with two
elements, named "name" and "points". "name" is a single character string,
corresponding to the texture class full name in the triangles native language
(but special character should be avoided). "points" is an ordered vector of
integers, corresponding to the numbers of the vertices numbers that compose
each classs polygon. The numbers in fact corresponds to the row names of

94

"tlr.an"
"unit.tx"

tt.points. They should be ordered, in the sense that each successive pair of
vertices will be joined by a polygon edge (+ one between the 1st and the last
points).
If you want to have a more precise idea of the codes shape for a new texture
triangle, you can have a look inside The Soil Texture Wizard code (FUNCTION TEXTURE WIZARD.R): search the name of a texture triangle (e.g.
FAO50.TT) in the code and look the structure of the list corresponding to
it.
If you implement a texture triangle that you think can be used by many soil
scientists, please consider sending its definitions code to me, I will implement it
into The Soil Texture Wizard (copy and paste)22 . If doing this, it is als good
to send an image of the reference texture triangle that was used to obtain the
triangles definition (so it can be checked!).

14

Further readings

Readers wishing to go further in the study of soil texture triangles and related topics may like the following articles: Richer de Forges et al. 2001 a (in
French, [25]) and b (Poster in English, [24]; Nemes et al. 1999 (about texture
transformation, [22]); Gerakis and Baer (program for USDA texture classification, [13]); Liebens 2001 (Excel MACRO for USDA texture classification, [19]);
Minasny and McBratney 2001 (about texture transformation, [20]); Teh and
Rashid 2003 (program for texture classification in a lot of systems, [28]) and
Christopher (Teh) and Mokhtaruddin 1996[7].

References
[1] Agriculture and Agri-Food Canada.
Glossary
dian
soil
information
system.
Internet,
april
http://sis.agr.gc.ca/cansis/intro.html.

cana2010.

[2] Anomymous.
Soil korngroendreieck particle size diagram.
Web page,
2009.
Last access 2009/08/24.
http://nibis.ni.schule.de/~trianet/soil/boden5.htm.
[3] Anonymous. The canadian soil information system (cansis) national soil
database (nsdb) land potential database (lpdb) fao soil texture. Website,
08 2009. http://sis.agr.gc.ca/cansis/nsdb/lpdb/faotext.html.
[4] Anonymous.
Fingerprobe
(boden).
Website
(Wikipedia.de),
2009.
Last
access
2009/08/24.http://de.wikipedia.org/wiki/Fingerprobe_%28Boden%29.
[5] D. Baize and B. Jabiol. Guide pour la description des sols. col. Techniques
et pratiques. INRA, 1995. 375 p.
22 Under the same open-source licence terms as all the function set, but with reference to
you work and your works model

95

[6] H. Bormann. Analysis of the suitability of the german soil texture


classification for the regional scale application of physical based hydrological model. Advances in Geosciences, 11:713, 2007. www.advgeosci.net/11/7/2007/.
[7] T.B.S. Christopher and A.M. Mokhtaruddin. A computer program to
determine the soil textural class in 1-2-3 for windows and excel. Communications in Soil Science and Plant Analysis, 27(9 and 10):23152319, 1996.
http://www.informaworld.com/smpp/content~db=all~content=a905339412~tab=linking.
[8] Defourny, Delvaux, Ducarme, and Radoux.
Travaux pratiques
de cartographie du sol.
Website, last checked 2009/10/14 2009.
http://www.icampus.ucl.ac.be/courses/MILA2230/document/texture.html.
[9] Defra Rural Development Service Technical Advice Unit.
Technical advice note 52 & 53 soil texture.
Technical report, Rural Development Service, august 2006.
6 p.
http://www.defra.gov.uk/environment/land/soil/information/publications.htm.
[10] European Soil Bureau working group HYdraulic PRoperties of European Soils (HYPRES). Texture classes. HYPRES Website, 08 2009.
http://www.macaulay.ac.uk/hypres/hypressoil.html.
[11] P. Filzmoser and K. Varmuza. chemometrics: Multivariate Statistical
Analysis in Chemometrics, 2008. R package version 0.4. http://cran.rproject.org/web/packages/chemometrics/index.html.
[12] GEOVLEX, MLU Halle-Wittenberg.
Glossardatenbank bodenart.
Website, 2009. Last access 2009/08/24. http://mars.geographie.unihalle.de/mlucampus/geoglossar/terme_datenblatt.php?terme=Bodenart.
[13] A. Gerakis and B. Baer. A computer program for soil textural classification. Soil Science Society of America Journal, 63:807808, 1999.
http://nowlin.css.msu.edu/software/triangle_form.html.
[14] Georgina Holbeche. Soilquality.org.au physics measuring soil texture in the laboratory. Online pdf document., Department of Agriculture and Food, The State of Western Australia The University of Western Australia. Healthy Soils for Sustainable Farms programme., 2008.
2p. http://www.soilquality.org.au/documents/28/original/Phys__Measuring_Soil_Texture_in_the_Lab_web.pdf.
[15] M. Jamagne. Bases et techniques dune cartographie des sols. Annales
Agronomiques, 18 (hors serie):142, 1967.
[16] R. M. Lark and T. F. A. Bishop. Cokriging particle size fractions
of the soil. European Journal of Soil Science, 58:763774, June 2007.
http://www3.interscience.wiley.com/journal/118000728/abstract.
[17] F. Leisch. Sweave: Dynamic generation of statistical reports using literate
data analysis. In Wolfgang Hardle and Bernd Ronz, editors, Compstat 2002
Proceedings in Computational Statistics, pages 575580. Physica Verlag,
Heidelberg, Germany, 2002. ISBN 3-7908-1517-9. http://www.stat.unimuenchen.de/~leisch/Sweave.
96

[18] Linnea Lidberg. Texturbestamning genom falt-, pipett- och hydrometermetoder. Examensarbete (msc soil science and environmental studies), SLU Institutionen for skoglig marklara (Department of Forest Soils), Uppsala, Sweden, 2009.
vol 20. 31 pp. http://exepsilon.slu.se/archive/00003079/.

[19] J.
Liebens.
Spreadsheet
macro
to
determine
usda
soil
textural
subclasses.
Communications in Soil Science
and
Plant
Analysis,
32(1
and
2):255265,
2001.
http://www.informaworld.com/openurl?genre=article&issn=0010%2d3624&volume=32&issue=1&
[20] B. Minasny and A.B. McBratney. The australian soil texture boomerang:
a comparison of the australian and usda/fao soil particle-size classification systems. Australian Journal of Soil Research, 39:14431451, 2001.
http://www.publish.csiro.au/nid/84/paper/SR00065.htm.
edologiques du
[21] Julien Moeys. Variabilite spatiale et determinismes agroUp

devenir dSun
herbicide dans lShorizon
de surface Application au cas
de lisoproturon dans un secteur agricole de Beauce chartraine. Soil science, AgroParisTech, Paris, France, December 2007. 273 pp. + annexes.
http://pastel.paristech.org/4448/.
[22] A. Nemes, J.H.M. W
osten, A. Lilly, and J.H. Oude Voshaar. Evaluation of different procedures to interpolate particle-size distributions to
achieve compatibility within soil databases. Geoderma, 90:187202, 1999.
http://dx.doi.org/10.1016/S0016-7061(99)00014-2.
[23] R Development Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria,
2009. ISBN 3-900051-07-0. http://www.R-project.org.

[24] A. Richer de Forges, C. Feller, M. Jamagne, and D. Arrouays.


Lost in the triangular diagrams of soil texture.
Poster, 2008.
http://www.prodinra.inra.fr/prodinra/pinra/data/2008/08/PROD2008387413ba_20080819120904
[25] A. Richer de Forges, C. Feller, M. Jamagne, and D. Arrouays. Perdus dans
le triangle des textures. Etudes et Gestion des Sols, 15(2):97111, 2008.
(en: Lost in the textures triangle).
[26] Soil Survey Division Staff. Soil survey manual, volume Handbook 18,
chapter 3. Soil Conservation Service. U.S. Department of Agriculture, 1993.
http://soils.usda.gov/technical/manual/print_version/chapter3.html.

[27] Sols de Bretagne. Phototh`eque etude dun sol triangle des textures
geppa. Website, 2009. Last access 2009/08/24. http://www.sols-debretagne.fr/index.php/component/option,com_datsogallery/Itemid,79/func,detail/catid,2/i
[28] C.B.S. Teh and M.A. Rashid.
Object-oriented code to lookup
soil texture classes for any soil classification scheme.
Communications in Soil Science and Plant Analysis, 34(1):111, 2003.
http://www.informaworld.com/smpp/content~db=all~content=a713624019~tab=linking.

97

[29] TGL 24300-05 1985-06. Aufnahme landwirtschaftlich genutzter standorte


- k
ornungsarten und skelettgehalt. Technical report, Bauhaus-Universitat,
Weimar, 1985.

[30] Bart
Van
Bossuyt.
De
belgische
textuurdriehoek.
website,
last
checked
2009/10/14
2009.
http://www.begeleidzelfstandigleren.com/aardrijkskunde/losse_animaties/textuurdriehoek_
[31] VEB FORSTPROJEKTIERUNG POTSDAM. Standortserkundungsanweisung sea74 - a/b. Technical report, VEB FORSTPROJEKTIERUNG
POTSDAM, 1974.
[32] W. N. Venables and B. D. Ripley. Modern Applied Statistics with
S. Springer, New York, fourth edition, 2002. ISBN 0-387-95457-0.
http://www.stats.ox.ac.uk/pub/MASS4.
[33] W. Verheye and J. Ameryckx. Mineral fractions and classificaton of soil
texture. Pedologie, 2:215225, 1984.

98

Das könnte Ihnen auch gefallen