Praca ma na celu praktyczne zastosowanie pakietu “ggtern” służącego do tworzenia diagramów trójkątnych (trójskładnikowych) w zagadnieniach geologicznych. Diagramy trójkątne są bardzo często wykorzystywane w geologii w celu sklasyfikowania skał oraz gruntów. Ponadto są przydatne przy przedstawieniu i interpretacji wyników badań geochemicznych, fizyko-chemicznych, które pomagają określić w jakich warunkach powstają minerały i skały. W pracy jako model został wykorzystany “Trójkąt Fereta”, który jest wykorzystywany do klasyfikacji gruntów drobnoziarnistych, sypkich i spoistych. Służy on do interpretacji wyników analizy granulometrycznej, w której próbkę rozdziela się na frakcję piaskową o średnicy zastępczej ziarna d=2-0.5 mm, pyłowej d= 0.05-0.002 mm oraz iłowej d<0.002 mm. Następnie waży się każdą frakcję i wylicza się jaki procent całej masy próbki stanowi dana frakcja. Przedstawiony kod jest gotowym narzędziem, które przyspieszy prace geologów. Ponadto modyfikując kod będzie można go zastosować do innych analiz.
Projekt powstał w wersji RStudio 3.4.0 ponieważ najnowszych wersjach pakiet “ggtern” nie działa.
#ładowanie potrzebnych pakietów
library(ggtern)
## Warning: package 'ggtern' was built under R version 3.4.4
## Loading required package: ggplot2
## --
## Remember to cite, run citation(package = 'ggtern') for further info.
## --
##
## Attaching package: 'ggtern'
## The following objects are masked from 'package:ggplot2':
##
## %+%, aes, annotate, calc_element, ggplot, ggplot_build,
## ggplot_gtable, ggplotGrob, ggsave, layer_data, theme,
## theme_bw, theme_classic, theme_dark, theme_gray, theme_light,
## theme_linedraw, theme_minimal, theme_void
library(plyr)
## Warning: package 'plyr' was built under R version 3.4.4
Szkielet diagramu jest złożony ze zbioru punktów, które posłużą do stworzenia poligonów. Kolumny w tabeli zostały nazwane w celu nadania punktom numerów oraz współrzędnych.
#Budowa szkieletu diagramu ze zbioru punktów
points <- data.frame(
rbind(c( 1,1.000,0.000,0.000),
c( 2,0.500,0.500,0.000),
c( 3,0.300,0.700,0.000),
c( 4,0.200,0.800,0.000),
c( 5,0.100,0.900,0.000),
c( 6,0.020,0.980,0.000),
c( 15,0.000,1.000,0.000),
c( 16,0.000,0.900,0.100),
c( 7,0.020,0.880,0.100),
c(8,0.300,0.500,0.200),
c(9,0.200,0.500,0.300),
c(10,0.100,0.600,0.300),
c(17,0.020,0.680,0.300),
c(18,0.000,0.700,0.300),
c(11,0.500,0.000,0.500),
c(20,0.300,0.000,0.700),
c(21,0.200,0.000,0.800),
c(22,0.100,0.000,0.900),
c(23,0.000,0.000,1.000),
c(12,0.300,0.200,0.500),
c(13,0.200,0.300,0.500),
c(14,0.100,0.300,0.600),
c(19,0.000,0.300,0.700)
)
)
colnames(points) = c("IDPoint","T","L","R")
base <- ggtern(data=points,aes(L,T,R)) +
theme_bw() + theme_hidetitles() +
geom_point(shape=21,size=10,color="blue",fill="white") +
geom_text(aes(label=IDPoint),color="blue")
print(base)
Z powstałych punktów, zostały stworzone poligony, które w odpowiednim zakresie wartości symbolizują konkretny rodzaj gruntu. Aby tego dokonać należy nazwać poligony tworząc obiekt data.frame z etykietami. Następnie na podstawie punktów stworzyć mapę poligonów, nadać kolejność łączenia, ponazywać kolumny, połączyć odpowiednie zbiory oraz połączyć etykiety z poligonami. Kolejność wpisanych nazw gruntów w “polygon.labels” oraz wpisywania poligonów w “polygons” ma znaczenie. Poligony są tworzone od góry do dołu, od lewej do prawej.
#Nadanie poligonom nazwy
polygon.labels <- data.frame(Label=c("ił","ił
piaszczysty","glina
piaszczysta zwięzła",
"glina piaszczysta","piasek gliniasty","piasek","piasek pylasty",
"glina zwięzła","glina","pył piaszczysty","ił
pylasty",
"glina
pylasta zwięzła",
"glina pylasta","pył"))
#Indeksacja poligonów
polygon.labels$IDLabel=1:nrow(polygon.labels)
#Tworzenie mapy poligonów na podstawie wcześniej stworzonych punktów
polygons <- data.frame(
rbind(c(1,1),c(1,2),c(1,8),c(1,12),c(1,11),
c(2,2),c(2,3),c(2,8),
c(3,3),c(3,4),c(3,9),c(3,8),
c(4,4),c(4,5),c(4,10),c(4,9),
c(5,5),c(5,6),c(5,17),c(5,10),
c(6,6),c(6,15),c(6,16),c(6,7),
c(7,7),c(7,16),c(7,18),c(7,17),
c(8,8),c(8,9),c(8,13),c(8,12),
c(9,9),c(9,10),c(9,14),c(9,13),
c(10,10),c(10,18),c(10,19),c(10,14),
c(11,11),c(11,12),c(11,20),
c(12,12),c(12,13),c(12,21),c(12,20),
c(13,13),c(13,14),c(13,22),c(13,21),
c(14,14),c(14,19),c(14,23),c(14,22)
)
)
#Nadanie odpowiednie kolejności przy tworzeniu poligonów - łączy odpowiednie punkty
polygons$pointOrder <- 1:nrow(polygons)
#Nadanie kolumnom nazwy
colnames(polygons) = c("IDLabel","IDPoint","PointOrder")
#Łączenie zbiorów
df <- merge(polygons,points)
df <- merge(df,polygon.labels)
df <- df[order(df$PointOrder),]
#Stworzenie etykiet przy pomocy library(plyr)
Labs = ddply(df,"Label",function(x){c(c(mean(x$T),mean(x$L),mean(x$R)))})
colnames(Labs) = c("Label","T","L","R")
Na podstawie utworzonych poligonów, powstał wykres bazowy do którego wstawiono za pomocą odpowiednich funkcji: tytuł, etykiety trzech frakcji uziarnienia, strzałki oraz podziałkę co 10%.
#Budowa wykresu
base <- ggtern(data=df,aes(L,T,R)) +
geom_polygon(aes(group=Label),color="black",alpha=0.25) +
geom_text(data=Labs,aes(label=Label),size=3,color="black") +
theme_bw() +
theme_mesh(10)+
theme_showarrows() +
custom_percent("procent") +
labs(title="Trójkąt Fereta",
fill = "Rodzaj gruntu",
T="ił",
L="piasek",
R="pył")
print(base)
Wczytane dane zawierają wyniki badań z analizy granulometrycznej dla 10 próbek. Były one wprowadzone do arkusza kalkulacyjnego w Excelu. Arkusz zawierał 4 kolumny: “probka” z nazwami próbek oraz “piasek”, “pył” i “ił”, które zawierają dane liczbowe o wartości od 0.00 do 1.00. W przygotowaniu własnych danych należy pamiętać o zastosowaniu kropki zamiast przecinka. Następnie dane zostały zapisane w pliku tekstowym (.txt).
Z zaimportowanych danych zostały wyciągnięte nazwy próbek aby ułatwić ich wstawienie do diagramu przy odpowiednim punkcie.
#####dodać swoje dane
ddf <- read.table(file = "C:/Users/andrz/Desktop/Analiza_granulometryczna.txt", header = T)
#####wyciągnąć nazwy próbek
point.labels <- ddf$probka
p <- base + geom_point(data=ddf,aes(piasek,pył,ił), size=2, colour='red') +
geom_text(data=ddf,aes(piasek,pył,ił),vjust = 1,hjust=-0.1, label=point.labels, size=4,colour='red', check_overlap = FALSE)
## Warning: Ignoring unknown aesthetics: z
## Warning: Ignoring unknown aesthetics: z
print(p)
Przy eksporcie pliku do druku można ustawić jego rozmiary, tak aby był wygodny do odczytu.
#eksport diagramu do pliku .png
png("plot1.png",width=800,height=600) #rozmiar diagramu
print(p)
dev.off()
## png
## 2
#Literatura
http://www.ggtern.com/docs/ http://www.ggtern.com/posts/ http://www.ggtern.com/2014/07/26/user-request-shepards-classification-sediments/