我一直在尝试使用 ggplot2 制作与此类似的图:
这是我的 R 代码:
df <- data.frame(
tecnica = factor(rep(1:4, each = 4)), # Repite cada tecnica 4 veces
bloque = factor(rep(1:4, times = 4)), # Iitera por cada bloque
resistencia = c(3129, 3000, 2865, 2890,
3200, 3300, 2975, 3150,
2800, 2900, 2985, 3050,
2600, 2700, 2600, 2765) # Observaciones en orden fila por fila
)
# Calcular la media y desviación estándar para la muestra.
media_resistencia <- mean(df$resistencia)
sd_resistencia <- sd(df$resistencia)
# Calcular la media por técnica y convertir los resultados en un dataframe
medias_df <- aggregate(resistencia ~ tecnica, data = df, mean)
ticks_values <- unlist(lapply(c(-3,-2,-1,0,1,2,3), function(x) round((x * sd_resistencia)+media_resistencia,2)))
ticks_values[[1]]<-ticks_values[[1]]-10
ticks_values[[length(ticks_values)]]<-ticks_values[[length(ticks_values)]]+10
library(ggplot2)
# Crear un data frame para la función de densidad
x_vals <- seq(min(ticks_values), max(ticks_values), length.out = 100)
density_vals <- data.frame(
x = x_vals,
y = dnorm(x_vals, mean = media_resistencia, sd = sd_resistencia)
)
# Crear la gráfica con ggplot2
ggplot(density_vals, aes(x = x, y = y)) +
geom_line(size = 0.5) + # Línea de la distribución normal
geom_point(data = medias_df, aes(x = resistencia, y = 0, color = tecnica), size = 4) +
geom_vline(xintercept = ticks_values[[4]], colour = "black", linetype=3, size = .5) +
scale_x_continuous(breaks = ticks_values, labels = ticks_values) +
scale_y_continuous(limits = c(0, max(density_vals$y))) +
theme_minimal() +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
axis.ticks.x = element_line(size = 0.7),
axis.ticks.length = unit(7, "pt"),
axis.line.x = element_line(size = 0.5, linetype=1),
axis.text.x = element_text(size = 10, angle = 0, hjust = 0.5, vjust = 0.5)) + # Rotar etiquetas X
labs(x = "Resistencia", y = NULL) # Etiqueta del eje X
这是我的结果:
如何将数据框中的值添加media_df
到绘图中作为点的标签?如何调整media_df
数据框中点的位置,以便 x 轴线与它们相交?