library(ggplot2)
# Crear datos para las curvas de energía
x <- seq(0, 10, length.out = 500)
# Función para crear curva asimétrica suave y larga
crear_curva_suave <- function(x, altura_pico, y_inicial, y_final) {
y <- numeric(length(x))
for(i in 1:length(x)) {
if(x[i] <= 3.5) {
# Subida suave hasta el pico usando función sigmoide
progreso <- x[i] / 3.5
# Suavizado con función seno para transición más natural
y[i] <- y_inicial + (altura_pico - y_inicial) * (sin(progreso * pi/2))^2
} else if(x[i] <= 7) {
# Bajada media suave
x_norm <- (x[i] - 3.5) / 3.5
y[i] <- altura_pico - (altura_pico - y_final - 1) * (sin(x_norm * pi/2))^1.5
} else {
# Bajada final muy suave hasta convergencia exacta
x_norm <- (x[i] - 7) / 3
# Usar exponencial para llegar exactamente al nivel final
factor_exp <- exp(-4 * x_norm)
y[i] <- y_final + (y_final + 1 - y_final) * factor_exp
}
}
return(y)
}
# Nivel inicial: Sustratos (energía alta)
nivel_sustratos <- 25
# Nivel final: Productos (energía baja - energía liberada)
nivel_productos <- 18
# Curva sin enzima (roja, pico más alto)
y_sin_enzima <- crear_curva_suave(x, altura_pico = 46,
y_inicial = nivel_sustratos,
y_final = nivel_productos)
# Curva con enzima (azul, pico más bajo)
y_con_enzima <- crear_curva_suave(x, altura_pico = 32,
y_inicial = nivel_sustratos,
y_final = nivel_productos)
# Crear data frame
datos <- data.frame(
x = rep(x, 2),
y = c(y_sin_enzima, y_con_enzima),
tipo = rep(c("Sin enzima", "Con enzima"), each = length(x))
)
# Crear el gráfico
ggplot(datos, aes(x = x, y = y, color = tipo)) +
geom_line(size = 1.5) +
# Líneas horizontales punteadas
geom_hline(yintercept = 18, linetype = "dashed", color = "gray60", size = 0.5) +
geom_hline(yintercept = 25, linetype = "dashed", color = "gray60", size = 0.5) +
geom_hline(yintercept = 32, linetype = "dashed", color = "gray60", size = 0.5) +
geom_hline(yintercept = 46, linetype = "dashed", color = "gray60", size = 0.5) +
# Flecha de energía de activación con enzima
annotate("segment", x = 6, xend = 6, y = 25, yend = 32,
arrow = arrow(length = unit(0.25, "cm"), ends = "both", type = "closed"),
color = "black", size = 0.6) +
# Flecha de energía de activación sin enzima
annotate("segment", x = 7.8, xend = 7.8, y = 25, yend = 46,
arrow = arrow(length = unit(0.25, "cm"), ends = "both", type = "closed"),
color = "black", size = 0.6) +
# Flecha de energía total liberada (desde sustratos hasta productos - nivel final)
annotate("segment", x = 9, xend = 9, y = 25, yend = 18,
arrow = arrow(length = unit(0.25, "cm"), type = "closed"),
color = "black", size = 0.6) +
# Etiquetas de las curvas
annotate("text", x = 2.5, y = 48,
label = "Sin enzima",
color = "#C55A6F", size = 4.5, fontface = "italic") +
annotate("text", x = 2.8, y = 34,
label = "Con enzima",
color = "#4A90D9", size = 4.5, fontface = "italic") +
# Etiqueta energía de activación con enzima
annotate("text", x = 6, y = 28.5,
label = "Energía de\nactivación\ncon la enzima",
hjust = -0.05, size = 3.8, color = "black", lineheight = 0.9) +
# Etiqueta energía de activación sin enzima
annotate("text", x = 7.8, y = 38,
label = "Energía de\nactivación\nsin la enzima",
hjust = -0.05, size = 3.8, color = "black", lineheight = 0.9) +
# Etiqueta energía total liberada
annotate("text", x = 9, y = 21.5,
label = "Energía total\nliberada durante\nla reacción",
hjust = -0.05, size = 3.8, color = "black", lineheight = 0.9) +
# Etiquetas en los extremos
annotate("text", x = 0.3, y = 23.5,
label = "Sustratos",
hjust = 0, vjust = 0, size = 4, color = "black", fontface = "bold") +
# Etiquetas con fórmulas químicas (usando geom_text)
geom_text(data = data.frame(x = 0.3, y = 21.5,
label = "Ej: C[6]*H[12]*O[6] + O[2]"),
aes(x = x, y = y, label = label),
hjust = 0, vjust = 1, size = 3.8, color = "black",
inherit.aes = FALSE, parse = TRUE) +
annotate("text", x = 9.7, y = 10.5,
label = "Productos",
hjust = 1, vjust = 0, size = 4, color = "black", fontface = "bold") +
geom_text(data = data.frame(x = 9.7, y = 8.5,
label = "CO[2] + H[2]*O"),
aes(x = x, y = y, label = label),
hjust = 1, vjust = 1, size = 3.8, color = "black",
inherit.aes = FALSE, parse = TRUE) +
# Colores personalizados
scale_color_manual(values = c("Sin enzima" = "#C55A6F",
"Con enzima" = "#4A90D9")) +
# Tema y etiquetas
labs(title = " ",
x = "Avance de la reacción",
y = "Energía") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0, size = 15,
color = "#4A90D9", face = "bold",
margin = margin(b = 15)),
legend.position = "none",
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
axis.line = element_line(color = "black", size = 0.8,
arrow = arrow(length = unit(0.3, "cm"), type = "closed")),
axis.title.x = element_text(hjust = 0.5, vjust = -0.5, size = 11), # Centrado
axis.title.y = element_text(angle = 90, vjust = 0.5, hjust = 0.5, size = 11), # Vertical y centrado
plot.margin = margin(20, 40, 10, 10)
) +
# Ajustar límites
coord_cartesian(xlim = c(-0.3, 10.5), ylim = c(8, 50), clip = "off")