多组数据的直方图与密度图绘制请求(基于R语言)
R语言绘制多变量直方图(含密度曲线与正态曲线)
1. 数据整理
首先将你的数据转换为适合ggplot2绘图的长格式(tidy data):
# 加载所需包 library(ggplot2) library(dplyr) library(tidyr) # 创建原始数据框 data <- data.frame( CR = c(2, 9, 10, 14, 24, 27, 29, 30, 34, 43, 50, 74, 86, 105, 140, 155, 200), EN = c(24, 52, 86, 110, 144, 154, 206, 242, 300, 302, 366, 403, 422, 427, 427, 434, 448), LC = c(447, 476, 543, 580, 647, 685, 745, 763, 819, 821, 863, 904, 908, 926, 934, 951, 968), VU = c(75, 96, 97, 217, 297, 498, 511, 551, 560, 564, 570, 575, 609, 673, 681, 700, 755) ) # 转换为长格式 tidy_data <- data %>% pivot_longer(cols = everything(), names_to = "Variable", values_to = "Value")
2. 绘制目标图形
使用ggplot2绘制分面直方图,同时叠加密度曲线和正态分布曲线:
ggplot(tidy_data, aes(x = Value)) + # 绘制直方图,y轴用密度匹配曲线 geom_histogram(aes(y = ..density..), bins = 10, fill = "lightblue", color = "black", alpha = 0.7) + # 叠加核密度曲线 geom_density(color = "red", size = 1) + # 叠加分组正态分布曲线(基于每个变量的均值和标准差) stat_function( fun = dnorm, args = list(mean = mean(.$Value), sd = sd(.$Value)), color = "darkgreen", size = 1, linetype = "dashed" ) + # 按变量分面,每行2个图(可按需调整列数) facet_wrap(~Variable, ncol = 2) + # 添加标题和坐标轴标签 labs( title = "Histogram with Density and Normal Curve", x = "Value", y = "Density" ) + # 使用简洁主题 theme_minimal()
关键说明
geom_histogram中y = ..density..是为了让直方图高度与密度曲线纵坐标匹配,确保两者可在同一坐标系展示。stat_function里的args会自动按每个分面子组计算均值和标准差,生成对应变量的正态拟合曲线。- 可通过调整
bins参数修改直方图的组数,ncol参数调整分面的列数,适配你的展示需求。
内容的提问来源于stack exchange,提问作者Sina Kh.
相关产品推荐
相关产品推荐

