Cargar paquetes y base de datos

library("pacman") #esta función llama al paquete instalado

p_load("ggplot2", #para graficar
       "dplyr", #para facilitar el manejo de datos
       "vroom", "tidyr","plotly") #llamar repositorios

# Importar datos
Curvas_disoc <- vroom(file="https://raw.githubusercontent.com/ManuelLaraMVZ/resultados_PCR_practica/refs/heads/main/Disoci_ejemplo1.csv")
## Rows: 55 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (6): Temperature, A1, B1, C1, D1, E1
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Curvas_disoc
## # A tibble: 55 × 6
##    Temperature    A1    B1    C1    D1     E1
##          <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1        65    1.96  1.98  2.11  2.11 0.0869
##  2        65.5  1.94  1.99  2.06  2.08 0.0834
##  3        66    1.89  1.93  2.03  2.07 0.0932
##  4        66.5  1.86  1.89  1.98  2.02 0.0676
##  5        67    1.82  1.89  1.94  1.98 0.0738
##  6        67.5  1.77  1.83  1.90  1.93 0.0766
##  7        68    1.74  1.78  1.86  1.87 0.0686
##  8        68.5  1.70  1.76  1.79  1.84 0.0689
##  9        69    1.65  1.71  1.79  1.80 0.0665
## 10        69.5  1.60  1.64  1.75  1.76 0.0744
## # ℹ 45 more rows

Modificar datos

Curvas_disoc2 <- Curvas_disoc %>%
  mutate(
    Temperatura = Temperature,
    DDR = A1,
    JRWF = B1,
    PPOF = C1,
    MLL = D1,
    H2O= E1
  ) %>%
  select(Temperatura, H2O, JRWF, PPOF, MLL, DDR)

Curvas_disoc2
## # A tibble: 55 × 6
##    Temperatura    H2O  JRWF  PPOF   MLL   DDR
##          <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
##  1        65   0.0869  1.98  2.11  2.11  1.96
##  2        65.5 0.0834  1.99  2.06  2.08  1.94
##  3        66   0.0932  1.93  2.03  2.07  1.89
##  4        66.5 0.0676  1.89  1.98  2.02  1.86
##  5        67   0.0738  1.89  1.94  1.98  1.82
##  6        67.5 0.0766  1.83  1.90  1.93  1.77
##  7        68   0.0686  1.78  1.86  1.87  1.74
##  8        68.5 0.0689  1.76  1.79  1.84  1.70
##  9        69   0.0665  1.71  1.79  1.80  1.65
## 10        69.5 0.0744  1.64  1.75  1.76  1.60
## # ℹ 45 more rows

Graficar

Curvas_disoc3 <- Curvas_disoc2 %>%
  pivot_longer(cols = -Temperatura,
               names_to = "Muestras",
               values_to = "Fluorescencias")

Curvas_disoc3
## # A tibble: 275 × 3
##    Temperatura Muestras Fluorescencias
##          <dbl> <chr>             <dbl>
##  1        65   H2O              0.0869
##  2        65   JRWF             1.98  
##  3        65   PPOF             2.11  
##  4        65   MLL              2.11  
##  5        65   DDR              1.96  
##  6        65.5 H2O              0.0834
##  7        65.5 JRWF             1.99  
##  8        65.5 PPOF             2.06  
##  9        65.5 MLL              2.08  
## 10        65.5 DDR              1.94  
## # ℹ 265 more rows

Derivadas

Derivadas <- Curvas_disoc2 %>%
  mutate(
    across(
      c(DDR, JRWF, PPOF, MLL, H2O),
      ~ -c(NA, diff(.x) / diff(Temperatura)),
      .names = "d_{.col}"
    )
  ) %>%
  select(Temperatura, starts_with("d_")) %>%
  slice(-1)

Derivadas
## # A tibble: 54 × 6
##    Temperatura  d_DDR   d_JRWF   d_PPOF  d_MLL     d_H2O
##          <dbl>  <dbl>    <dbl>    <dbl>  <dbl>     <dbl>
##  1        65.5 0.0365 -0.0147   0.0940  0.0711  0.00703 
##  2        66   0.102   0.108    0.0614  0.0146 -0.0197  
##  3        66.5 0.0695  0.0883   0.112   0.108   0.0512  
##  4        67   0.0652  0.00898  0.0646  0.0772 -0.0123  
##  5        67.5 0.109   0.114    0.0903  0.0923 -0.00567 
##  6        68   0.0666  0.0994   0.0707  0.122   0.0162  
##  7        68.5 0.0774  0.0335   0.139   0.0558 -0.000754
##  8        69   0.0860  0.0979  -0.00165 0.0850  0.00488 
##  9        69.5 0.111   0.146    0.0908  0.0844 -0.0159  
## 10        70   0.0582  0.0279   0.130   0.0864  0.00967 
## # ℹ 44 more rows

Reordenar datos

Derivadas2 <- Derivadas %>%
  pivot_longer(cols = -Temperatura,
               names_to = "Muestras",
               values_to = "Derivadas")

Derivadas2
## # A tibble: 270 × 3
##    Temperatura Muestras Derivadas
##          <dbl> <chr>        <dbl>
##  1        65.5 d_DDR      0.0365 
##  2        65.5 d_JRWF    -0.0147 
##  3        65.5 d_PPOF     0.0940 
##  4        65.5 d_MLL      0.0711 
##  5        65.5 d_H2O      0.00703
##  6        66   d_DDR      0.102  
##  7        66   d_JRWF     0.108  
##  8        66   d_PPOF     0.0614 
##  9        66   d_MLL      0.0146 
## 10        66   d_H2O     -0.0197 
## # ℹ 260 more rows

Graficar

Grafica_disoc <- ggplot(Curvas_disoc3,
                        aes(x = Temperatura,
                            y = Fluorescencias,
                            color = Muestras)) +
  geom_line(linewidth = 0.8) +
  theme_classic() +
  labs(title = "Curvas de disociación",
       subtitle = "Todas las muestras",
       caption = "Diseño: Yaniv Bar Yosef",
       x = "Temperatura (°C)",
       y = "Fluorescencia (u.a.)")

Grafica_disoc

Gráfica de disociación derivada

Grafica_derivada <- ggplot(Derivadas2,
                           aes(x = Temperatura,
                               y = Derivadas,
                               color = Muestras)) +
  geom_line(linewidth = 0.5) +
  theme_classic() +
  labs(title = "Curvas de la derivada de disociación",
       subtitle = "Todas las muestras",
       caption = "Diseño: Yaniv Bar Yosef",
       x = "Temperatura (°C)",
       y = expression(-Delta~F / Delta~T)) +
  theme(axis.line = element_line(linewidth = 1.2, color = "black"),
        axis.title = element_text(face = "bold"),
        axis.text = element_text(face = "bold"),
        legend.title = element_text(face = "bold"),
        legend.text = element_text(face = "bold")) +
  scale_x_continuous(breaks = seq(min(Derivadas2$Temperatura),
                                  max(Derivadas2$Temperatura),
                                  by = 1.5))

Grafica_derivada

Graficar 3D

library(plotly)

Grafica_derivada_3D <- plot_ly(
  data = Derivadas2,
  x = ~Temperatura,
  y = ~Muestras,
  z = ~Derivadas,
  color = ~factor(Muestras),
  type = "scatter3d",
  mode = "lines",
  line = list(width = 6)
)

Grafica_derivada_3D <- plotly::layout(
  Grafica_derivada_3D,
  title = "Curvas de derivada en 3D - Yaniv Bar Yosef",
  scene = list(
    xaxis = list(title = "Temperatura (°C)"),
    yaxis = list(title = "Muestras"),
    zaxis = list(title = "-ΔF/ΔT")
  )
)

Grafica_derivada_3D

Gáfica dato individual

Grafica_derivada_equipo <- ggplot(Derivadas,
                                  aes(x = Temperatura)) +
  geom_line(aes(y = d_MLL, color = "d_MLL"), linewidth = 1.5) +
  geom_line(aes(y = d_H2O, color = "d_H2O"), linewidth = 1.5) +
  scale_color_manual(values = c("d_MLL" = "#1e2f7c", "d_H2O" = "#900C3F")) +
  theme_classic() +
  labs(title = "Derivada de disociación dato individual",
       caption = "Diseño: Yaniv Bar Yosef",
       x = "Temperatura",
       y = expression(-Delta~F / Delta~T)) +
  theme(axis.line = element_line(linewidth = 1.2, color = "black"),
        axis.title = element_text(face = "bold"),
        axis.text = element_text(face = "bold"),
        legend.title = element_text(face = "bold"),
        legend.text = element_text(face = "bold")) +
  scale_x_continuous(breaks = seq(min(Derivadas$Temperatura),
                                  max(Derivadas$Temperatura),
                                  by = 2.5))

Grafica_derivada_equipo

Etiquetas

Pico <- max(Derivadas$d_MLL)
Pico
## [1] 0.738565
Tm <- Derivadas %>%
  filter(d_MLL == Pico)

Tm
## # A tibble: 1 × 6
##   Temperatura d_DDR d_JRWF d_PPOF d_MLL   d_H2O
##         <dbl> <dbl>  <dbl>  <dbl> <dbl>   <dbl>
## 1          82 0.491  0.531  0.661 0.739 0.00154

Gráfica con etiquetas

Grafica_derivada_equipo2 <- Grafica_derivada_equipo +
  geom_vline(xintercept = Tm$Temperatura,
             color = "#FF5733",
             linetype = "dashed",
             linewidth = 1) +
  ggrepel::geom_label_repel(data = Tm,
                            aes(x = Temperatura,
                                y = d_MLL,
                                label = paste("Tm =", round(Temperatura, 1), "°C")),
                            nudge_x = 3,
                            nudge_y = -0.3,
                            max.overlaps = 100,
                            color = "black",
                            fill = "#9ecffa")

Grafica_derivada_equipo2