OSMA olivine spinel mantle array [R][Geochemistry]


The relationship between the Fo content of olivine and the Cr/(Cr+Al) atomic ratio (=Cr#) of spinel in spinel peridotites (Arai, 1997) is often used for discriminating the origin of ultramafic rocks. Also, this plot helps us to know the degrees of melting if the peridotites are residues. Peridotites tend to have higher Cr# of spinel and Fo contents in olivine with increasing degrees of partial melting.

This plot is helpful but we have to trace the line from the original paper and draw it on plots using illustrating software.

I will show how we can easily make this OSMA plot using R!


Library

library(ggplot2)
library(tidyverse)
library(RColorBrewer)
library(viridis)


Data (abyssal peridotites)

data_new <- read.csv("Path HERE!!/residual_abyssal_peridotites.csv")
data_new$Lithology[data_new$Lithology == ""] = NA
data_new$Lithology <- data_new$Lithology %>% replace_na('Perid')

I follow the Cr# = Cr/(Cr+Al) atomic ratio of spinel used in Arai (1997) but the Cr# in the database is 100*Cr/(Cr+Al). So I renormalize it.

Cr_Spl <- data_new$CrSPL/100
data_new <- cbind(data_new, Cr_Spl)



OSMA coordinates (Arai, 1997; Fig 8)

I extracted the coordinates of OSMA lines using WebPlotDigitizer

Fo_lower_limit <- 
  c(96.20253165, 96.10126582, 96, 95.89873418, 95.79746835, 95.64556962, 95.49367089, 95.34177215,
    95.18987342, 95.03797468, 94.93670886, 94.83544304, 94.73417722, 94.58227848, 94.48101266, 94.37974684,
    94.32911392, 94.2278481, 94.17721519, 94.07594937, 93.97468354, 93.87341772, 93.7721519, 93.72151899,
    93.72151899, 93.67088608, 93.62025316, 93.56962025, 93.51898734, 93.51898734, 93.46835443, 93.41772152,
    93.41772152, 93.36708861, 93.3164557, 93.3164557, 93.26582278, 93.21518987, 93.16455696, 93.11392405,
    93.06329114, 93.01265823, 93.01265823, 92.96202532, 92.91139241, 92.86075949, 92.81012658, 92.75949367,
    92.70886076, 92.65822785, 92.60759494, 92.55696203, 92.4556962, 92.4556962, 92.40506329, 92.35443038,
    92.25316456, 92.20253165, 92.10126582, 92, 91.89873418, 91.79746835, 91.69620253, 91.59493671,
    91.49367089, 91.34177215, 91.24050633, 91.03797468, 90.88607595, 90.73417722, 90.58227848, 90.37974684,
    90.17721519, 89.97468354, 89.82278481, 89.62025316
  )

Cr_lower_limit <- 
  c(0.915217391, 0.913043478, 0.910869565, 0.908695652, 0.906521739, 0.902173913, 0.897826087, 0.893478261,
    0.886956522, 0.880434783, 0.873913043, 0.865217391, 0.858695652, 0.85, 0.841304348, 0.832608696, 
    0.823913043, 0.815217391, 0.804347826, 0.793478261, 0.780434783, 0.767391304, 0.756521739, 0.741304348,
    0.726086957, 0.713043478, 0.695652174, 0.680434783, 0.663043478, 0.647826087, 0.632608696, 0.619565217,
    0.6, 0.580434783, 0.563043478, 0.547826087, 0.534782609, 0.513043478, 0.493478261, 0.473913043,
    0.456521739, 0.434782609, 0.417391304, 0.406521739, 0.393478261, 0.382608696, 0.369565217, 0.354347826,
    0.339130435, 0.32826087, 0.317391304, 0.304347826, 0.286956522, 0.273913043, 0.258695652, 0.25,
    0.236956522, 0.22173913, 0.206521739, 0.191304348, 0.17826087, 0.165217391, 0.152173913, 0.139130435,
    0.12826087, 0.113043478, 0.102173913, 0.084782609, 0.07173913, 0.063043478, 0.054347826, 0.045652174,
    0.039130435, 0.032608696, 0.02826087, 0.02173913
  )


Fo_upper_limit <-c(
  92.60759494, 92.40506329, 92.20253165, 92.05063291, 91.89873418, 91.69620253, 91.49367089, 91.24050633,
  91.08860759, 90.93670886, 90.83544304, 90.73417722, 90.58227848, 90.48101266, 90.37974684, 90.27848101,
  90.2278481, 90.12658228, 90.07594937, 90.02531646, 89.97468354, 89.92405063, 89.87341772, 89.82278481,
  89.82278481, 89.7721519, 89.7721519, 89.72151899, 89.67088608, 89.56962025, 89.51898734, 89.41772152,
  89.36708861, 89.3164557, 89.26582278, 89.21518987, 89.16455696, 89.06329114, 89.01265823, 88.96202532,
  88.86075949, 88.81012658, 88.70886076, 88.65822785, 88.60759494, 88.50632911, 88.40506329, 88.30379747,
  88.15189873, 88, 87.84810127, 87.69620253, 87.5443038, 87.34177215, 87.24050633, 87.08860759, 
  86.93670886, 86.73417722, 86.53164557, 86.27848101, 86.07594937, 85.97468354,
  NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
)


Cr_upper_limit <-c(
  0.995652174, 0.991304348, 0.986956522, 0.982608696, 0.97826087, 0.97173913, 0.963043478, 0.952173913,
  0.943478261, 0.930434783, 0.919565217, 0.906521739, 0.889130435, 0.873913043, 0.856521739, 0.839130435,
  0.826086957, 0.808695652, 0.789130435, 0.77173913, 0.754347826, 0.736956522, 0.713043478, 0.691304348,
  0.676086957, 0.660869565, 0.641304348, 0.619565217, 0.591304348, 0.563043478, 0.539130435, 0.515217391,
  0.489130435, 0.465217391, 0.445652174, 0.430434783, 0.417391304, 0.402173913, 0.389130435, 0.37826087,
  0.363043478, 0.345652174, 0.323913043, 0.313043478, 0.3, 0.286956522, 0.269565217, 0.254347826, 
  0.234782609, 0.219565217, 0.204347826, 0.191304348, 0.17826087, 0.167391304, 0.156521739, 0.147826087,
  0.139130435, 0.130434783, 0.12173913, 0.113043478, 0.106521739, 0.102173913,
  NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
)


osma <- as.data.frame(cbind(Fo_lower_limit,Cr_lower_limit,Fo_upper_limit,Cr_upper_limit))




Vizualization (OSMA lines)

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black") +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black") + 
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel')
plot(p)



Vizualization (OSMA + data)

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black") +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black") + 
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel')
plot(p)





Vizualization (OSMA + data)

Changing theme and color palette

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black") +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black") + 
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_color_viridis(discrete = TRUE, option = "D")
plot(p)



Vizualization (OSMA + data)

Changing color manually

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black") +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black") + 
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_colour_manual(values = c("AAR" = "green4",
                                 "EPR" = "sienna4",
                                 "CIR" = "orangered1",
                                 "MAR" = "orange1",
                                 "SWIR" = "royalblue4",
                                 "LT" = "lightskyblue3",
                                 "GAK" = "royalblue1",
                                 "DMM" = "black"))
plot(p)




Vizualization (Final version)

Editing/reversing the axes 

crbreaks = c(80,82,84,86,88,90,92,94,96,98,100)
minor_crbreaks = c(81,83,87,89,91,93,95,97,99)


p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black") +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black") +
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  scale_y_continuous(breaks=seq(0,1,0.2), limits=c(0,1)) + 
  scale_x_reverse(breaks = crbreaks, minor_breaks=minor_crbreaks, limits=c(95,85)) +
  theme(legend.position = "right") + 
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_colour_manual(values = c("AAR" = "green4",
                                 "EPR" = "sienna4",
                                 "CIR" = "orangered1",
                                 "MAR" = "orange1",
                                 "SWIR" = "royalblue4",
                                 "LT" = "lightskyblue3",
                                 "GAK" = "royalblue1",
                                 "DMM" = "black"))
plot(p)





Vizualization (facet_wrap(Ridge))

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black", size = 1) +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black", size = 1) +
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  scale_y_continuous(breaks=seq(0,1,0.2), limits=c(0,1)) + 
  scale_x_reverse(breaks = crbreaks, minor_breaks=minor_crbreaks, limits=c(96,85)) +
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_colour_manual(values = c("AAR" = "green4",
                                 "EPR" = "sienna4",
                                 "CIR" = "orangered1",
                                 "MAR" = "orange1",
                                 "SWIR" = "royalblue4",
                                 "LT" = "lightskyblue3",
                                 "GAK" = "royalblue1",
                                 "DMM" = "black")) +
  theme(legend.position = "none") +
  facet_wrap(vars(Ridge))
plot(p)


Vizualization (facet_wrap(Location))


p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black", size = 1) +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black", size = 1) +
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  scale_y_continuous(breaks=seq(0,1,0.2), limits=c(0,1)) + 
  scale_x_reverse(breaks = crbreaks, minor_breaks=minor_crbreaks, limits=c(96,85)) +
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_colour_manual(values = c("AAR" = "green4",
                                 "EPR" = "sienna4",
                                 "CIR" = "orangered1",
                                 "MAR" = "orange1",
                                 "SWIR" = "royalblue4",
                                 "LT" = "lightskyblue3",
                                 "GAK" = "royalblue1",
                                 "DMM" = "black")) +
  theme(legend.position = "none") +
  facet_wrap(vars(Location))
plot(p)





Vizualization (facet_wrap(Rock))

p <- ggplot() + 
  geom_line(osma, mapping = aes(x = Fo_lower_limit, y = Cr_lower_limit), color = "black", size = 1) +
  geom_line(osma, mapping = aes(x = Fo_upper_limit, y = Cr_upper_limit), color = "black", size = 1) +
  geom_point(data_new, mapping = aes(Fo, Cr_Spl, color = Ridge), alpha = 0.8) + 
  scale_y_continuous(breaks=seq(0,1,0.2), limits=c(0,1)) + 
  scale_x_reverse(breaks = crbreaks, minor_breaks=minor_crbreaks, limits=c(96,85)) +
  xlab('Fo# olivine') + 
  ylab('Cr# of spinel') + 
  theme_bw() +
  scale_colour_manual(values = c("AAR" = "green4",
                                 "EPR" = "sienna4",
                                 "CIR" = "orangered1",
                                 "MAR" = "orange1",
                                 "SWIR" = "royalblue4",
                                 "LT" = "lightskyblue3",
                                 "GAK" = "royalblue1",
                                 "DMM" = "black")) +
  theme(legend.position = "bottom") +
  facet_wrap(vars(Lithology))
plot(p)





keywords: abyssal peridotites, clinopyroxene, spinel, olivine, olivine-spinel-mantle-array, rstats, r, plot, Geochemistry, Geology, Petrology, using R, r bloggers







Post a Comment

1 Comments

  1. Hey! Looks stunning and thank you for adding the line coordinates :-)
    You can shorten writing the data-frame for the lines a bit by omitting cbind and as., so:
    osma <- data.frame(Fo_lower_limit,Cr_lower_limit,Fo_upper_limit,Cr_upper_limit)

    ReplyDelete