# data management
library(soilDB)
library(aqp)
library(dplyr)
library(sf)
library(viridis)
library(broom)
library(sharpshootR)
# plotting
library(ggmap)
library(raster)
library(cowplot)
Latah County is an important agricultural area with a topographically diverse landscape. Located in north-central Idaho, this county provides important agricultural goods, such as wheat and barley, to the rest of the state. It is for this reason that soils are treated as an especially valuable resource in this region. Soils are so important, in fact, that Latah county was home to Idaho’s first soil conservation district.
Additionally, Latah county has a diverse range of topography. The western portion of the region contains the rolling hills of the Palouse prairie, and to the south the Potlatch river forms deep canyons as it cuts through loess-covered hills. Elevations in the area range from 1,000 to almost 5,000 feet as a result. Topography is a major soil-forming factor (Jenny 1994) and therefore variation in soils tend to follow gradients of topography in parts of the region. For example, changes in slope along these topographic gradients modulate the intensity of processes like erosion and water movement. Soil properties such as clay content and depth vary along these gradients as a result.
Regional soil scientists have a vast knowledge of many of these soil-landscape relationships. However, explicitly researching and documenting the range of soil characteristics along a topographic transect (also known as a toposequence) is often not done in regional Soil Survey offices. The purpose of this project is to gather greater detail on a specific toposequence important to this region in order to provide evidence for conventional wisdom relating to soil-landscape models.
# load idaho counties and latah county shapefiles
idaho <- read_sf("C:\\ArcGIS\\SHAPEFILE\\IdahoCounties.shp")
latah_sm <- read_sf("C:\\ArcGIS\\BASE\\ID057\\spatial\\soilmu_a_id057.shp")
# simplify and convert Latah to tidy object for plotting
lsimple <- rmapshaper::ms_simplify(latah_sm)
l_tidy <- tidy(as(lsimple, "Spatial"), region = "MUSYM")
# create tidy object from idaho sf for plotting
ID_tidy <- tidy(as(idaho, "Spatial"), region = 'NAME')
# create bounding box for latah
bb <- sf::st_bbox(lsimple)
bb <- make_bbox(lon = bb[c(3, 1)], lat = bb[c(2, 4)])
# create bounding box for idaho
bb2 <- sf::st_bbox(idaho)
bb2 <- make_bbox(lon = bb2[c(3, 1)], lat = bb2[c(2, 4)])
# create second bounding box for latah
bb.l <- as(extent(lsimple), 'SpatialPolygons')
# define coordinates
proj4string(bb.l) <- CRS('+proj=longlat +datum=WGS84 +no_defs')
#transform into dataframe
bb.l.df <- fortify(bb.l)
## create maps
# larger latah map
gmap <- get_map(bb, maptype = "terrain", source = "osm")
latah_gg <- ggmap(gmap) +
geom_path(data = l_tidy, aes(x = long, y = lat, group = group)) +
ggtitle('Latah County')
#smalle idaho map with latah bounding box
gmap2 <- get_map(bb2, maptype = "watercolor", source = "osm")
idaho_gg <- ggmap(gmap2) +
geom_path(data = ID_tidy, aes(x = long, y = lat, group = group)) +
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank()
) +
geom_polygon(
data = bb.l,
aes(x = long, y = lat, group = group),
colour = 'red',
fill = NA,
size = 2
)
#combine latah and idaho map into one plot
gg_inset <- ggdraw()+
draw_plot(latah_gg)+
draw_plot(idaho_gg, x = 0.72, y = 0.05, width = 0.3, height = 0.3)+
theme(plot.margin = unit(c(0,0,0,0), 'cm'))
# plot
gg_inset
The objectives of this project are:
Compare plots of the OSD pedons
# fetch OSD's for series of interest
soi <- c('norwidge','porrett','threebear')
osdp <- fetchOSD(soi)
# encode horizon boundary distinctness
osdp$hd <- hzDistinctnessCodeToOffset(osdp$distinctness,
codes = c('very abrupt', 'abrupt', 'clear', 'gradual', 'diffuse'))
# encode horizon boundary topography
osdp$hzto <- hzTopographyCodeToOffset(osdp$topography,
codes = c('smooth', 'wavy', 'irregular', 'broken'))
# also encode horizon boundary topography las line type
osdp$hzto.lty <- hzTopographyCodeToLineType(osdp$topography,
codes = c('smooth', 'wavy', 'irregular', 'broken'))
# concise representation of hz bnd distinctness and topography
# # similar to field notes
osdp$bnd.code <- sprintf("%s%s",
substr(osdp$distinctness, 1, 1),
substr(osdp$topography, 1, 1))
# remove NA
osdp$bnd.code <- gsub('NANA', '', osdp$bnd.code)
# plot
par(mar = c(0, 0, 0, 1), bg = 'white', fg = 'black')
plotSPC(
osdp,
width = 0.3,
name.style = 'center-center',
cex.names = 0.8,
plot.depth.axis = FALSE,
hz.depths = FALSE,
shrink = TRUE,
hz.distinctness.offset = 'hd',
hz.topography.offset = 'hzto',
hz.boundary.lty = 'hzto.lty'
)
# add legend
legend(
'bottomright',
horiz = TRUE,
legend = c('Smooth', 'Wavy', 'Irregular', 'Broken'),
lty = 1:4,
inset = 0.05,
bty = 'n',
cex = 0.85
)
These soils range from a fragipan in Threebear to fragic properties in Norwidge and then finally a strong argillic in Porrett. There are also significant color differences along with differences in horizon topography. Porrett has the smoothest horizon boundaries compared to the wavy boundaries of the other two series. Furthermore, Porrett has a large section of eluviation, whereas the other series have very little, and Threebear has some interfingering of E into the Bt horizons.
The first step is to get the average geomorphic positions of each series.
# fetch OSDs with extended data
s <- fetchOSD(soi, extended = TRUE)
# gather hillslope positions
res <- vizHillslopePosition(s$hillpos)
# plot
print(res$fig)
Then, plot a dendogram using the catenary sorting.
#order of dominant position from summit to toeslope
s$hillpos
## series Toeslope Footslope Backslope Shoulder Summit n shannon_entropy
## 1 NORWIDGE 0.0000 0.1818 0.5455 0.0455 0.2273 22 0.6945788
## 2 PORRETT 1.0000 0.0000 0.0000 0.0000 0.0000 2 0.0000000
## 3 THREEBEAR 0.1795 0.2436 0.1538 0.0769 0.3462 78 0.9349531
labs <- c(2,1,3)
# plot
par(mar=c(0,0,1,1))
SoilTaxonomyDendrogram(s$SPC, rotationOrder = labs, width=0.25)
mtext('approx. catenary sorting', side = 2, line=-1, font=3, cex=1.25)
The series, ordered from summit to toeslope, are Threebear, Norwidge, and Porrett. While Threebear is dominantly found in the summit position, there is some overlap with Norwidge as they both occur on the backslope, footslope, and summit. Porrett, on the other hand, is only found in the toeslope position. There is also a relationship between the taxonomic classes along the catenary sequence. The Udivitrands are on the upper parts of the slope and go from an Oxyaquic subgroup to a Alfic subgroup, which may be evidence of the varying hydrological processes along the topographic gradient. Finally, at the toeslope position Porrett is the farthest away taxonomically as an Aquandic Epiaqualf. The shift from Andisols to an Alfisol also indicates that topographic position is modulating the presence of volcanic ash in the soil.
To get a better understanding of soil morphology in relation to topography, two soil properties are of interest: clay content, and average depth class. These two properties were chosen because they are present in most of the NASIS pedon data and are assumed to be affected by topographic position in this region.
To properly analyze the data in a meaningful way, horizons were generalized for all soil series.
Note: only the code for the Norwidge series is shown here in order to streamline this document.
# grab the Threebear, Norwidge, and Porrett pedons from selected set
#p <- fetchNASIS(from = 'pedons')
# alternatively, load a previously saved object of pedons
load('final_proj_ped.Rdata')
# generate depth classes for later analysis
site(p) <- aqp::getSoilDepthClass(p)
# subset Norwidge series from data
norwidge <- subset(p, grepl('Norwidge', taxonname))
# tabulate horizan names
table(norwidge$hzname)
##
## 2B/E 2B/E2 2BE 2BEtx 2Bt 2Bt/E 2Bt/E1 2Bt/E2 2Bt1 2Bt2 2Bt3
## 1 1 2 1 2 3 1 1 3 3 1
## 2Bt4 2Bt5 2Btx 2Btx/E 2Btx1 2Btx2 2Bw2 2E 2E/Bt 2E/Btx 2EB
## 1 1 5 1 3 2 2 2 4 1 1
## 2EBtx 3BC 3Bt1 3Bt2 3Btx1 3Btx2 A B/E Bt1 Bt2 Bw
## 1 1 1 1 1 1 12 1 1 1 7
## Bw1 Bw2 E/B EB Oe Oei Oi
## 6 4 1 1 2 2 9
# look at unique horizon designations
unique(norwidge$hzname)
## [1] "A" "Bw" "2E/Bt" "2Bt/E" "2Bt" "Oi" "2Bt1" "2Bt2"
## [9] "Bw1" "2Bw2" "2Btx" "2BE" "Oe" "2E" "2EB" "2B/E"
## [17] "2Btx1" "Oei" NA "Bw2" "EB" "E/B" "B/E" "Bt1"
## [25] "Bt2" "2B/E2" "2Btx2" "2Bt3" "2Bt4" "2Bt5" "2BEtx" "2EBtx"
## [33] "2E/Btx" "2Btx/E" "2Bt/E1" "2Bt/E2" "3Bt1" "3Bt2" "3Btx1" "3Btx2"
## [41] "3BC"
#examine what is used in OSD
l <- fetchOSD('norwidge')
l$hzname
## [1] "Oi" "Oe" "A" "Bw1" "Bw2" "2Bt/E1" "2Bt/E2" "2Btx1"
## [9] "2Btx2" "2Btxb1" "2Btxb2"
# create 5 GHLs: A, cambic, elluvial, illuvial, and fragic
prototype.labels <- c('A',
'Bw',
'E',
'Bt',
'Btx')
# REGEX rules describing mapping from field data to prototype.labels
patterns.to.match <- c('^A',
'^B.*w|^2B*w',
'^E.|^2E|^2B/|^B/|2BE',
'^B.*t|^2B*t|^3B*t',
'^2B.*tx|^3B.*tx')
# apply prototype labels `new` to horizons matching `pat`
norwidge$newgenhz <-
generalize.hz(x = norwidge$hzname,
new = prototype.labels,
pat = patterns.to.match)
# get the horizon data frame out of the SPC
hzdata <- horizons(norwidge)
#summarize clay content
res_df <- hzdata %>%
group_by(newgenhz) %>%
summarize(clay_mean = mean(clay, na.rm = TRUE),
clay_sd = sd(clay, na.rm = TRUE),
clay_min = min(clay, na.rm = TRUE),
clay_max = max(clay, na.rm = TRUE),
clay_Q05 = quantile(clay, probs = 0.05, na.rm = TRUE),
clay_Q50 = quantile(clay, probs = 0.5, na.rm = TRUE),
clay_Q95 = quantile(clay, probs = 0.95, na.rm = TRUE))
newgenhz | clay_mean | clay_sd | clay_min | clay_max | clay_Q05 | clay_Q50 | clay_Q95 |
---|---|---|---|---|---|---|---|
A | 8.00000 | 0.000000 | 8 | 8 | 8.00 | 8.0 | 8.00 |
Bw | 9.18750 | 3.370831 | 8 | 20 | 8.00 | 8.0 | 16.25 |
E | 19.33333 | 3.415650 | 15 | 27 | 15.00 | 20.0 | 24.20 |
Bt | 23.00000 | 4.802777 | 15 | 32 | 17.25 | 23.5 | 30.50 |
Btx | 27.81818 | 6.289963 | 17 | 40 | 21.00 | 25.0 | 38.50 |
not-used | NaN | NA | Inf | -Inf | NA | NA | NA |
newgenhz | clay_mean | clay_sd | clay_min | clay_max | clay_Q05 | clay_Q50 | clay_Q95 |
---|---|---|---|---|---|---|---|
A. | 20.85385 | 5.132676 | 10.0 | 27.0 | 13.000 | 20.00 | 27.000 |
E | 16.88000 | 4.284557 | 10.0 | 24.8 | 11.400 | 17.00 | 23.540 |
Bt | 26.60588 | 6.562819 | 16.0 | 34.4 | 16.000 | 28.00 | 34.080 |
C | 13.60000 | 3.286335 | 10.0 | 16.0 | 10.000 | 16.00 | 16.000 |
not-used | 23.95000 | 3.040560 | 21.8 | 26.1 | 22.015 | 23.95 | 25.885 |
newgenhz | clay_mean | clay_sd | clay_min | clay_max | clay_Q05 | clay_Q50 | clay_Q95 |
---|---|---|---|---|---|---|---|
A | 7.678161 | 1.426447 | 5 | 12 | 6.00 | 8 | 10.00 |
Bw | 8.477612 | 2.025092 | 5 | 17 | 6.00 | 8 | 12.00 |
E | 15.714286 | 2.924870 | 10 | 25 | 11.00 | 16 | 21.00 |
Bt | 18.800000 | 5.069517 | 12 | 24 | 12.60 | 21 | 23.60 |
Btx | 25.642857 | 4.253635 | 15 | 32 | 19.55 | 27 | 30.05 |
not-used | 29.000000 | NA | 29 | 29 | 29.00 | 29 | 29.00 |
Examining only the Bt horizons because that is shared among the three series.
# create new dataframe with only Bts
df1 <- subset(res_df, grepl('^Bt$', newgenhz))
df2 <- subset(res_df2, grepl('^Bt$', newgenhz))
df3 <- subset(res_df3, grepl('^Bt$', newgenhz))
# create separate ids for each series
df1$id <- 'norwidge'
df2$id <- 'threebear'
df3$id <- 'porrett'
df_Bts <- rbind(df1,df2,df3)
#sort by increasing clay, which follows the catenary sorting as well
df_Bts$id <- factor(df_Bts$id,
levels = df_Bts$id[order(df_Bts$clay_mean)])
#create error bars
min <- df_Bts$clay_mean - df_Bts$clay_sd
max <- df_Bts$clay_mean + df_Bts$clay_sd
# plot
cp <-
ggplot(
data = df_Bts,
aes(x = id, y = clay_mean))+
geom_bar(stat = 'identity',
fill = c('#ff6f69','#88d8b0','#ffcc5c' )) +
geom_errorbar(aes(ymin = min, ymax = max), width = 0.2) +
geom_point(size = 2) +
ylab('Average Clay Content') +
xlab('Series')
cp
Again here the only code shown is that for Norwidge, as it is identical for the other series
#norwidge
nor_s <- site(norwidge)
dep_df <- nor_s %>%
summarize(depth_mean = mean(depth, na.rm = TRUE),
depth_sd = sd(depth, na.rm = TRUE),
depth_min = min(depth, na.rm = TRUE),
depth_max = max(depth, na.rm = TRUE),
depth_Q05 = quantile(depth, probs = 0.05, na.rm = TRUE),
depth_Q50 = quantile(depth, probs = 0.5, na.rm = TRUE),
depth_Q95 = quantile(depth, probs = 0.95, na.rm = TRUE))
depth_mean | depth_sd | depth_min | depth_max | depth_Q05 | depth_Q50 | depth_Q95 |
---|---|---|---|---|---|---|
155.75 | 21.90112 | 108 | 206 | 131.1 | 151 | 186.2 |
depth_mean | depth_sd | depth_min | depth_max | depth_Q05 | depth_Q50 | depth_Q95 |
---|---|---|---|---|---|---|
152.0909 | 27.63134 | 75 | 186 | 113.5 | 152 | 178 |
depth_mean | depth_sd | depth_min | depth_max | depth_Q05 | depth_Q50 | depth_Q95 |
---|---|---|---|---|---|---|
54.37278 | 33.65189 | 40 | 175 | 40 | 43 | 152 |
dep_df$id <- 'norwidge'
dep_df2$id <- 'porrett'
dep_df3$id <- 'threebear'
df_depths <- rbind(dep_df, dep_df2, dep_df3)
#create order that follows catenary sorting
positions <- c('threebear','norwidge','porrett')
#create error bars
min_d <- df_depths$depth_mean - df_depths$depth_sd
max_d <- df_depths$depth_mean + df_depths$depth_sd
# plot
dp <-
ggplot(
data = df_depths,
aes(x = id, y = depth_mean))+
geom_bar(stat = 'identity',
fill = c('#ff6f69', '#ffcc5c', '#88d8b0')) +
geom_errorbar(aes(ymin = min_d, ymax = max_d), width = 0.2) +
geom_point(size = 2) +
ylab('Average Depth (cm)') +
xlab('Series')+
scale_x_discrete(limits = positions)
dp
Understanding the role of topography on soil development and morphology is an important factor as it relates to managing local erosion and hydrology. Furthermore, a detailed perspective on the influence of topography can assist soil scientists in summarizing soil-landscape models and generating map units. Here, I examined three important soil series that form a toposequence from summit to backslope to toeslope. These series are Threebear, Norwidge, and Porrett (fig. 4). I found that along the topographic gradient from summit to toeslope there is an increase in both clay content in the illuvial horizon (fig. 5) as well as an increase in average soil depth (fig. 6). This suggests that field observations validate certain assumptions about soil development and provide evidence to support current soil-landscape models. However, topography does not fully explain the development of other soil properties, such as fragipans and fragic properties in the summit and back slope positions.
Clay content increasing from summit to toe slope positions has been documented in previous studies (Dessalegn et al., 2014), and the observation is generally accredited to hydrological processes transporting clay down slope. Furthermore, in situ clay translocation and development occurs at a greater rate at more moderate slopes. However, this does not explain why the fragic properties do not follow a similar trend. The hypothesis for this pattern is that the fragic properties here are more related to parent material than slope positions. Fragipans in Latah county are purely clay and lack other cementing agents (such as iron). It may be that these clays were formed in the Tertiary aged alluvial deposits, and when loess was later deposited on top, perched water gradually compacted and oriented the clays over time to create fragic properties. This did not happen in the Porrett series possibly due to alluvial action mixing the two distinct parent materials.
Depth also followed an increasing trend from summit to toeslope. This also reflects what is often found in field observations. Similar to the process that governs clay transport, sediment also follows a downhill trajectory. Upslope soils therefore experience a net loss in material as erosion out paces soil development. Alternatively, soil in the toe slope position receives sediment from upslope in additon to in situ soil development. However, I would have originally expected deeper soil in the summit positions because the slope there tends to be flat. One explanation for why Threebear does not have a greater average depth is because many of the Threebear observations in NASIS are from a Dynamic Soil Properties study, and as such many of the pits only went to 50cm (table 6).
In summary, this project examines a local toposequence and validates current soil-landscape assumptions with previous field observations. I show that clay content and average soil depth increase along the toposequence, and that this is likely due to several processes related to slope, such as erosion and water movement. Furthermore, I found that topography, while it does seem to explain a portion of observed soil properties, does not explain everything. Fragic properties found in this region are likely a result of some other soil-forming factor, and gaps in pedon data limit conclusions that can be made about these series. Therefore, this project would have benefited from a more complete data set, and this points to the continual need to update NASIS data. Future projects should focus on modelling soil properties using topographic derivatives such as Topographic Wetness Index (TWI) or Digital Elevation Models (DEM) in order to further test assumptions. As well, studies should examine a more diverse array of soils with fragic properties along toposequences.
Dessalegn, D., Beyene, S., Ram, N., Walley, F. and Gala, T.S., 2014. Effects of topography and land use on soil characteristics along the toposequence of Ele watershed in southern Ethiopia. Catena, 115, pp.47-54.
Jenny, H., 1994. Factors of soil formation: a system of quantitative pedology. Courier Corporation.