Debe incluir, lugar de la salida de campo, fechas de la salida, las variables de medición, equipos utilizados, personal participante.
Crear un mapa con la localización de cada uno de los equipos
Los equipos de medición junto a una breve descripción de las capacidades de estos.
Efectuar mediciones experimentales a lo largo de la ensenada de Trebal con el fin de identificar y obtener una primera aproximación sobre algunas variables físicas que controlan su dinámica.
Se busca recolectar información sobre variables hidrodinámicas tales como nivel del mar, magnitud y dirección de corrientes, magnitud y dirección del oleaje.
Hacer un levantamiento topográfico
Se realizará una campaña de medición durante 4h continúas, donde se dispondrá un arreglo de equipos (correntómetros) perpendiculares a la línea de costa con el fin de obtener información sobre variables hidrodinámicas tales como nivel del mar, magnitud y dirección de oleaje y corriente.
La información de corrientes y oleaje se obtendrá con un correntómetro Aquadop profiler de frecuencia 2MHz, localizado en fondo y con los conos acústicos dirigidos hacia la superficie. Se utilizarán celdas de medición de 0.2 m, con una tasa de medición de alta frecuencia para obtener datos de magnitud y dirección de corrientes en cada celda, las corrientes se medirán cada 10 min, con promedios de 2 min.
Para el oleaje se tomarán 2048 muestras a una tasa de 2Hz, cada 30 min. Para el caso del equipo vector, este se configurará para que tome 19200 datos a una tasa de 64Hz, cada 10 min.
Para cada una de las siguientes gráficas debe hacer una descripción de lo observado.
En primera instancia, se cargan los datos.
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(TSstudio)
library(skimr)
library(oce)
## Cargando paquete requerido: gsw
Se crearon dos funciones para facilitar la lectura y unión de las matrices de datos generados por el equipo.
## Conversión de datos .dat a txt
convert_dat_to_txt <- function(directory) {
# Obtener una lista de archivos .dat en el directorio
dat_files <- list.files(directory, pattern = "\\.dat$", full.names = TRUE)
# Iterar sobre cada archivo y guardarlo como .txt
for (dat_file in dat_files) {
# Leer el archivo .dat
data <- read.table(dat_file, header = FALSE, stringsAsFactors = FALSE)
# Crear el nombre del archivo de salida .txt
txt_file <- sub("\\.dat$", ".txt", dat_file)
# Guardar los datos en formato .txt
write.table(data, file = txt_file, sep = "\t", row.names = FALSE, col.names = FALSE, quote = FALSE)
}
}
## Conversión de datos .wad a txt
convert_wad_to_txt <- function(directory) {
# Obtener una lista de archivos .wad en el directorio
wad_files <- list.files(directory, pattern = "\\.wad$", full.names = TRUE)
# Iterar sobre cada archivo y guardarlo como .txt
for (wad_file in wad_files) {
# Leer el archivo .wad
data <- read.table(wad_file, header = FALSE, stringsAsFactors = FALSE)
# Crear el nombre del archivo de salida .txt
txt_file <- sub("\\.wad$", ".txt", wad_file)
# Guardar los datos en formato .tx
write.table(data, file = txt_file, sep = "\t", row.names = FALSE, col.names = FALSE, quote = FALSE)
}
}
## Creación del data.frame
read_txt_files <- function(directory) {
# Obtener una lista de archivos .txt en el directorio
files <- list.files(directory, pattern = "\\.txt$", full.names = TRUE)
# Leer y combinar los archivos en un solo data.frame
combined_data <- do.call(rbind, lapply(files, function(file) {
read.table(file, header = FALSE, sep = "", stringsAsFactors = FALSE)
}))
return(combined_data)
}
A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:
Metric | Value |
---|---|
Number of measurements | 22,373 |
Time of first measurement | 31/10/2024 10:00:00 a.m. |
Time of last measurement | 31/10/2024 03:15:48 p.m. |
Las variables registradas por el equipo fueron las siguientes:
# | Variable | Unidad |
---|---|---|
1 | Burst counter | |
2 | Ensemble counter | (1-65536) |
3 | Velocity (Beam1 | X |
4 | Velocity (Beam2 | Y |
5 | Velocity (Beam3 | Z |
6 | Amplitude (Beam1) | counts |
7 | Amplitude (Beam2) | counts |
8 | Amplitude (Beam3) | counts |
9 | SNR (Beam1) | dB |
10 | SNR (Beam2) | dB |
11 | SNR (Beam3) | dB |
12 | Correlation (Beam1) | % |
13 | Correlation (Beam2) | % |
14 | Correlation (Beam3) | % |
15 | Pressure | dbar |
16 | Analog input 1 | |
17 | Analog input 2 | |
18 | Checksum | (1 = failed) |
En primera instancia, se leen los datos y se asignan los nombres correspondientes
convert_dat_to_txt("D:/Usuario/Documents/Instrumentación/g1")
G1 = read_txt_files("D:/Usuario/Documents/Instrumentación/g1") %>%
rename(
burst = V1,
ensemble = V2,
v_x = V3,
v_y = V4,
v_z = V5,
amplitud_1 = V6,
amplitud_2 = V7,
amplitud_3 = V8,
snr_1 = V9,
snr_2 = V10,
snr_3 = V11,
cor_1 = V12,
cor_2 = V13,
cor_3 = V14,
presion = V15,
analog_1 = V16,
analog_2 = V17,
checksum = V18
)
A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:
Metric | Value |
---|---|
Number of measurements | 687,565 |
Time of first measurement | 31/10/2024 09:40:00 a.m. |
Time of last measurement | 31/10/2024 03:34:05 p.m. |
Las variables registradas por el equipo fueron las siguientes:
# | Variable | Unidad |
---|---|---|
1 | Burst counter | |
2 | Ensemble counter | (1-65536) |
3 | Velocity (Beam1 | X |
4 | Velocity (Beam2 | Y |
5 | Velocity (Beam3 | Z |
6 | Amplitude (Beam1) | counts |
7 | Amplitude (Beam2) | counts |
8 | Amplitude (Beam3) | counts |
9 | SNR (Beam1) | dB |
10 | SNR (Beam2) | dB |
11 | SNR (Beam3) | dB |
12 | Correlation (Beam1) | % |
13 | Correlation (Beam2) | % |
14 | Correlation (Beam3) | % |
15 | Pressure | dbar |
16 | Analog input 1 | |
17 | Analog input 2 | |
18 | Checksum | (1 = failed) |
A continuación, se leen los datos y se asignan los nombres correspondientes
G2 = suppressMessages(read_table("G224302.txt", col_names = FALSE, col_types = NULL) %>%
rename(
burst = X1,
ensemble = X2,
v_x = X3,
v_y = X4,
v_z = X5,
amplitud_1 = X6,
amplitud_2 = X7,
amplitud_3 = X8,
snr_1 = X9,
snr_2 = X10,
snr_3 = X11,
cor_1 = X12,
cor_2 = X13,
cor_3 = X14,
presion = X15,
analog_1 = X16,
analog_2 = X17,
checksum = X18
))
head(G2)
## # A tibble: 6 × 18
## burst ensemble v_x v_y v_z amplitud_1 amplitud_2 amplitud_3 snr_1
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1 0.247 -0.19 0.073 43 44 41 0.9
## 2 1 2 0.257 0.565 -0.411 43 43 43 0.9
## 3 1 3 0.278 0.0863 -0.0681 42 44 44 0.4
## 4 1 4 0.319 0.113 -0.0138 43 42 41 0.9
## 5 1 5 0.215 0.317 -0.158 43 42 41 0.9
## 6 1 6 0.210 -0.306 0.305 40 41 43 -0.4
## # ℹ 9 more variables: snr_2 <dbl>, snr_3 <dbl>, cor_1 <dbl>, cor_2 <dbl>,
## # cor_3 <dbl>, presion <dbl>, analog_1 <dbl>, analog_2 <dbl>, checksum <dbl>
A partir de la información ofrecida por el equipo en el archivo .hdr se obtiene la siguiente información:
Metric | Value |
---|---|
Number of measurements | 31 |
Time of first measurement | 31/10/2024 09:30:00 a.m. |
Time of last measurement | 31/10/2024 02:32:01 p.m. |
Las variables registradas por el equipo fueron las siguientes:
# | Variable | Unidad |
---|---|---|
1 | Burst counter | |
2 | Ensemble counter | |
3 | Pressure | dbar |
4 | Spare | |
5 | Analog input | |
6 | Velocity (Beam1 | X |
7 | Velocity (Beam2 | Y |
8 | Velocity (Beam3 | Z |
9 | Velocity (N/A) | m/s |
10 | Amplitude (Beam1) | counts |
11 | Amplitude (Beam2) | counts |
12 | Amplitude (Beam3) | counts |
En primera instancia, se leen los datos y se asignan los nombres correspondientes
convert_wad_to_txt("D:/Usuario/Documents/Instrumentación/g4")
G4 = read_txt_files("D:/Usuario/Documents/Instrumentación/g4") %>%
rename(
burst = V1,
ensemble = V2,
presion = V3,
spare = V4,
analog = V5,
v_x = V6,
v_y = V7,
v_z = V8,
v_na = V9,
amplitud_1 = V10,
amplitud_2 = V11,
amplitud_3 = V12,
amplitud_na = V13
)
Para leer los datos del tercer grupo se genera un ciclo for que itere entre los diferentes archivos .csv. Pero primero se lee el archivo principal que contiene los nombres de las variables, apartir en cada iteración se irán anexando los diferentes archivos.
G3 = read.csv2("D:/Usuario/Documents/Instrumentación/g3/g4243001001.csv")
files = list.files("D:/Usuario/Documents/Instrumentación/g3/", pattern = "\\.csv$", full.names = TRUE)
for (file in files) {
# Leer el archivo sin encabezado
new_data = read_csv2(file,
col_names = colnames(G3),
show_col_types = FALSE,
locale = locale(decimal_mark = ",", grouping_mark = "."))
# Combinar
G3 = rbind(G3, new_data)
}
Debido a que los datos han sido asignados como variables de tipo carácter por error en la lectura, se realizó un tratamiendo a los datos para adaptar la variable del tiempo al formato POSIXct y se defineron las demás variables como númericas.
G3 = G3 %>%
mutate(
DateTime = as.POSIXct(DateTime, format="%d/%m/%Y %H:%M:%S"),
across(Battery:AnalogIn1, as.numeric))
## Warning: There were 7 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(Battery:AnalogIn1, as.numeric)`.
## Caused by warning:
## ! NAs introducidos por coerción
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 6 remaining warnings.
Gráficas de inclinación de los ejes axiales (pitch, roll y heading). El objetivo de gráficar los datos de inclinación de los ejes axiales es observar la constancia de estas variables a lo largo del tiempo. Siendo esta el objetivo se consideró pertinente hacer un resumen estadístico básico de las variables en cuestión y así corruborar la calidad de los datos.
G3 %>%
select(Pitch, Heading, Roll) %>%
skim() %>%
select(-n_missing, -complete_rate)
Name | Piped data |
Number of rows | 28673 |
Number of columns | 3 |
_______________________ | |
Column type frequency: | |
numeric | 3 |
________________________ | |
Group variables | None |
Variable type: numeric
skim_variable | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|
Pitch | -1.72 | 1.64 | -14.0 | -2.0 | -2.0 | -2 | 32.9 | ▁▇▁▁▁ |
Heading | 1602.47 | 539.08 | 228.2 | 1830.0 | 1831.0 | 1832 | 1876.0 | ▂▁▁▁▇ |
Roll | 0.69 | 1.60 | -17.9 | 0.9 | 0.9 | 1 | 34.0 | ▁▇▁▁▁ |
Como se puede observar para tres variables, existen datos anomalos, pero son poco representativos dado que la desviación estándar y el histograma indican que los datos tienen una distribución leptocurtica.
Estos datos anómalos representan aquellos tomandos por el equipo durante el tiempo en que se estaba instalando en su posición. Esto ocurrió entre las 9:00:00 y las 9:30:00, debidoa un error en la instalación el equipo tomó datos incorrectos y, por lo tanto, estos no son representativos.
Teniendo en cuenta el intervalo en el cuál los datos estaban más uniformemente distribuidos se realizó una gráfica de la serie de tiempo.
G3 %>%
select(Heading, DateTime) %>%
filter(Heading > 1825 & Heading < 1835) %>%
ggplot(aes(x= DateTime, y= Heading))+
geom_line()+
theme_bw()
Como se puede observar los valores de Headign son relativamente constantes entre las 9:30:00 y las 15:12:00, aproximadamete. No obstante, si se gráfica la serie de tiempo completa se podrá observar más claramente el error presente en el primer burst y el último, es decir, los comprendidos entre las 9:00:00 a 9:30:00, al instalar el equipo; y 15:15:00 a 15:17:00, al sacarlo. Para comprobar esto se hará la serie de tiempo con la variable Pitch.
G3 %>%
ggplot(aes(x= DateTime, y=Pitch))+
geom_line()+
theme_bw()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
Este mismo comportamiento está presente para el Roll. Por tal motivo, se estableció una ventana de tiempo comprendida entre las 9:30:00 hasta las 15:12:15, ya que se conoce que los demás datos están erróneos.
G3 %>%
select(DateTime, Roll) %>%
filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>%
ggplot(aes(x=DateTime, y=Roll))+
geom_line()+
theme_bw()
También se procede a graficar el Pitch adecuadamente. Sin embargo, es curioso notar la presencia de una variación del Pitch entre -0.5 y 0 después de las 15:00:00.
G3 %>%
select(DateTime, Pitch) %>%
filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>%
ggplot(aes(x=DateTime, y=Pitch))+
geom_line()+
theme_bw()
Serie de tiempo de presión y nivel del mar para cada uno de los equipos asignados durante todo el intervalo de monitoreo.
Gráfica de la serie de tiempo en bruto.
G3 %>%
filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>%
ggplot(aes(x=DateTime, y=Pressure))+
geom_line()+
theme_bw()
A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.
G3 %>%
filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_presion = mean(Pressure, na.rm = TRUE), # Calculamos el promedio de presión
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup() %>%
ggplot(aes(x=DateTime, y=promedio_presion))+
geom_line()+
geom_smooth(method = "lm", se = FALSE) +
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
Metric | Value |
---|---|
Number of measurements | 22,373 |
Time of first measurement | 31/10/2024 10:00:00 a.m. |
Time of last measurement | 31/10/2024 03:15:48 p.m. |
Sampling rate | 2 Hz |
Burst interval | 1800 sec |
Samples per burst | 2048 |
# Parámetros
sampling_rate <- 64
burst_interval <- 300 # 600 segundos
samples_per_burst <- 19200
start_time <- ymd_hms("2024-10-31 09:40:00")
delta_time <- 1 / sampling_rate
G2 <- G2 %>%
group_by(burst) %>%
mutate(
time_offset = (ensemble - 1) * delta_time,
DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
) %>%
ungroup()
# Crear secuencia completa de tiempo
max_time = max(G2$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)
# Fusionar con la serie completa
G2 = data.frame(DateTime = full_time_sequence) %>%
left_join(G2, by = "DateTime")
G2 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
ggplot(aes(x=DateTime, y=presion))+
geom_line()+
theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).
A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.
G2 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup() %>%
ggplot(aes(x=DateTime, y=promedio_presion))+
geom_line()+
geom_smooth(method = "lm", se = FALSE) +
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 160 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 10 rows containing missing values or values outside the scale range
## (`geom_line()`).
Metric | Value |
---|---|
Number of measurements | 22,373 |
Time of first measurement | 31/10/2024 10:00:00 a.m. |
Time of last measurement | 31/10/2024 03:15:48 p.m. |
Sampling rate | 2 Hz |
Burst interval | 1800 sec |
Samples per burst | 2048 |
# Parámetros
sampling_rate <- 2
burst_interval <- (1800/2) # 1800 segundos
samples_per_burst <- 2048
start_time <- ymd_hms("2024-10-31 10:10:00")
delta_time <- 1 / sampling_rate
G1 <- G1 %>%
group_by(burst) %>%
mutate(
time_offset = (ensemble - 1) * delta_time,
DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
) %>%
ungroup()
# Crear secuencia completa de tiempo
max_time = max(G1$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)
# Fusionar con la serie completa
G1 = data.frame(DateTime = full_time_sequence) %>%
left_join(G1, by = "DateTime")
G1 %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
ggplot(aes(x=DateTime, y=presion))+
geom_line()+
theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).
A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.
G1 %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup() %>%
ggplot(aes(x=DateTime, y=promedio_presion))+
geom_line()+
geom_smooth(method = "lm", se = FALSE) +
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 124 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
Metric | Value |
---|---|
Number of measurements | 21,647 |
Time of first measurement | 31/10/2024 09:30:00 a.m. |
Time of last measurement | 31/10/2024 02:32:01 p.m. |
Sampling rate | 2 Hz |
Burst interval | 1800 sec |
Samples per burst | 2048 |
# Parámetros
sampling_rate <- 2
burst_interval <- (1800/2) # 1800 segundos
samples_per_burst <- 2048
start_time <- ymd_hms("2024-10-31 09:30:00")
delta_time <- 1 / sampling_rate
G4 <- G4 %>%
group_by(burst) %>%
mutate(
time_offset = (ensemble - 1) * delta_time,
DateTime = start_time + time_offset + (burst - 1) * (samples_per_burst * delta_time + burst_interval)
) %>%
ungroup()
# Crear secuencia completa de tiempo
max_time = max(G4$DateTime, na.rm = TRUE)
full_time_sequence = seq(from = start_time, to = max_time, by = delta_time)
# Fusionar con la serie completa
G4 = data.frame(DateTime = full_time_sequence) %>%
left_join(G4, by = "DateTime")
G4 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
ggplot(aes(x=DateTime, y=presion))+
geom_line()+
theme_bw()
A continuación, se realizá un promedio por minuto de la variable deseada, es decir, la presión. De esta manera, se logrará obtener una serie de tiempo más limipia.
G4 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_presion = mean(presion, na.rm = TRUE), # Calculamos el promedio de presión
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup() %>%
ggplot(aes(x=DateTime, y=promedio_presion))+
geom_line()+
geom_smooth(method = "lm", se = FALSE) +
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 126 rows containing non-finite outside the scale range
## (`stat_smooth()`).
Magnitudes de las corrientes para el equipo asignados a su grupo, ralizar una gráficas de las componentes perpendiculares (x) y tranversales (y) de las corrientes, así como una gráfica de la magnitud total de la corriente.
# Componente perpendicular (x)
G1 %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
ggplot(aes(x=DateTime, y= v_x))+
geom_line()+
theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Componente tranversal (y)
G1 %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
ggplot(aes(x=DateTime, y= v_y))+
geom_line()+
theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).
## magnitud total de la corriente
G1 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
ggplot(aes(x=DateTime, y=magnitud))+
geom_line()+
theme_bw()
## Warning: Removed 1447 rows containing missing values or values outside the scale range
## (`geom_line()`).
G1 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2)),
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_magnitud = mean(magnitud, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute"))
) %>%
ungroup() %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
ggplot(aes(x=DateTime, y=promedio_magnitud))+
geom_line()+
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## Warning: Removed 11 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Componente perpendicular (x)
G2 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
ggplot(aes(x=DateTime, y= v_x))+
geom_line()+
theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Componente tranversal (y)
G2 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
ggplot(aes(x=DateTime, y= v_y))+
geom_line()+
theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).
## magnitud total de la corriente
G2 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
ggplot(aes(x=DateTime, y=magnitud))+
geom_line()+
theme_bw()
## Warning: Removed 38399 rows containing missing values or values outside the scale range
## (`geom_line()`).
G2 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2)),
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_magnitud = mean(magnitud, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute"))
) %>%
ungroup() %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
ggplot(aes(x=DateTime, y=promedio_magnitud))+
geom_line()+
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
## Warning: Removed 9 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Componente perpendicular (x)
G4 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
ggplot(aes(x=DateTime, y= v_x))+
geom_line()+
theme_bw()
# Componente tranversal (y)
G4 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
ggplot(aes(x=DateTime, y= v_y))+
geom_line()+
theme_bw()
## magnitud total de la corriente
G4 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
ggplot(aes(x=DateTime, y=magnitud))+
geom_line()+
theme_bw()
G4 %>%
mutate(
magnitud = sqrt((v_x^2)+(v_y^2)),
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
promedio_magnitud = mean(magnitud, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute"))
) %>%
ungroup() %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
ggplot(aes(x=DateTime, y=promedio_magnitud))+
geom_line()+
theme_bw()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
Para el desarrollo de los sticks Plot se realizó una adaptación del código de Matlab generado por Indika Weligamage. La publicación del mismo se encuentra en el siguiente enlace: https://www.mathworks.com/matlabcentral/answers/682938-how-to-create-a-stickplot.
(Tristemnete, no fui capaz de crear una función que me permitisee hacer el proceso de forma automática. Así que vamos repetir el proceso manualmente usando como variable auxiliar df)
Para cualquiera a quién interese, aquí está una guía para comprender como se lee una gráfica de sticks: https://tabs.gerg.tamu.edu/Tglo/stick.html
En primera instancia se define una función para generar lags de la serie de tiempo.
myslidingavg <- function(x, n = 3) {
stats::filter(x, rep(1 / n, n), sides = 2)
}
Para desarrollar el stick plot se debe conocer el angulo formado por las componentes, los cuales se suavizan por medio de la función myslidingavg
\[ \theta = \text{atan}(dv_y, v_x) \]
df = G2
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)
Posteriormente se debe obtener el módulo del vector resultante entre las compontentes.
\[ \text{mod} = \sqrt{v_x^2 + v_y^2} \] \[ v_{x,\text{smoothed}} = \text{mod} \cdot \cos(\theta_{\text{smoothed}}) \] \[ v_{y,\text{smoothed}} = \text{mod} \cdot \sin(\theta_{\text{smoothed}}) \]
df <- df %>%
mutate(
mod = sqrt(df$v_x^2 + df$v_y^2),
v_x_smoothed = mod * cos(theta_smoothed),
v_y_smoothed = mod * sin(theta_smoothed)
)
También, se aplican los cambios calculando los promedios en cada minuto de las componontes. Después de este tratamiento, finalmente, se gráfica el stickplot por medio de la libería oce.
Prueba = df %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.06, ylab='', yaxt='n', length=0)
df = G1
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)
df <- df %>%
mutate(
mod = sqrt(df$v_x^2 + df$v_y^2),
v_x_smoothed = mod * cos(theta_smoothed),
v_y_smoothed = mod * sin(theta_smoothed)
)
Prueba = df %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.025, ylab='', yaxt='n', length=0)
df = G4
# Smooth angles
theta <- atan2(df$v_y, df$v_x)
theta_smoothed <- myslidingavg(theta, n = 3)
df <- df %>%
mutate(
mod = sqrt(df$v_x^2 + df$v_y^2),
v_x_smoothed = mod * cos(theta_smoothed),
v_y_smoothed = mod * sin(theta_smoothed)
)
Prueba = df %>%
filter(
DateTime > ymd_hms("2024-10-31 10:30:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime)
) %>%
group_by(horas, minutos) %>%
summarise(
v_x_smoothed = mean(v_x_smoothed, na.rm = TRUE),
v_y_smoothed = mean(v_y_smoothed, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute")) # Creamos DateTime para gráficas
) %>%
ungroup()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
plotSticks(Prueba$DateTime, 0, Prueba$v_x_smoothed, Prueba$v_y_smoothed, yscale=0.2, ylab='', yaxt='n', length=0)
G1 %>%
filter(
DateTime > ymd_hms("2024-10-31 10:42:00") &
DateTime < ymd_hms("2024-10-31 15:00:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime),
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
pivot_longer(cols = c(magnitud, presion),
names_to = "Variable",
values_to = "Value") %>%
ggplot( aes(x = minutos, y = horas, fill = Value)) +
geom_tile() +
facet_wrap(~Variable, scales = "free") +
scale_fill_viridis_c() +
theme_minimal()
G2 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:55:00") &
DateTime < ymd_hms("2024-10-31 15:10:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime),
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
group_by(horas, minutos) %>%
summarise(
mean_magnitud = mean(magnitud, na.rm = TRUE),
mean_presion = mean(presion, na.rm = TRUE),
DateTime = first(floor_date(DateTime, "minute"))
) %>%
ungroup()%>%
pivot_longer(cols = c(mean_magnitud, mean_presion),
names_to = "Variable",
values_to = "Value") %>%
ggplot( aes(x = minutos, y = horas, fill = Value)) +
geom_tile() +
facet_wrap(~Variable, scales = "free") +
scale_fill_viridis_c() +
theme_minimal()
## `summarise()` has grouped output by 'horas'. You can override using the
## `.groups` argument.
G4 %>%
filter(
DateTime > ymd_hms("2024-10-31 09:30:00") &
DateTime < ymd_hms("2024-10-31 14:35:00")
) %>%
mutate(
horas = hour(DateTime),
minutos = minute(DateTime),
segundos = second(DateTime),
magnitud = sqrt((v_x^2)+(v_y^2))
) %>%
pivot_longer(cols = c(magnitud, presion),
names_to = "Variable",
values_to = "Value") %>%
ggplot( aes(x = minutos, y = horas, fill = Value)) +
geom_tile() +
facet_wrap(~Variable, scales = "free") +
scale_fill_viridis_c() +
theme_minimal()
Gráfica conjunta de nivel y magnitud de las corrientes en pcolor.
Gráfica de periodograma de Welch para los datos de nivel del mar de los Aquadopp más lejanos y cercanos a la costa (revisar el informe de pre-salida para utilizar los equipos correspondientes)
No sé cómo se calcula la altura significativa y no tengo idea de que significa \(T_p\).
También, se realizó una serie de tiempo de la temperatura, más que todo porque me pareció “cool”.
G3 %>%
filter(DateTime > "2024-10-31 09:30:00" & DateTime < "2024-10-31 15:12:15") %>%
ggplot(aes(x=DateTime, y=Temperature))+
geom_line()+
theme_bw()