如何用ggplot叠加HTRU2数据集两类样本的正态分布曲线?
基于HTRU2数据集绘制两类正态分布叠加曲线
首先修正数据汇总逻辑:你当前的pulsar_data_summary里计算的mean_stdev_ip是Stdev_IP特征的均值,并非Mean_IP的标准差。要画正态分布曲线,我们需要每个类别下目标特征(比如Mean_IP)的均值和标准差,先调整汇总代码:
# 修正数据汇总:计算每个类别下目标特征的均值与标准差 pulsar_data_summary <- pulsar_data %>% group_by(Class) %>% summarize( mean_ip = mean(Mean_IP), sd_ip = sd(Mean_IP), # 新增:计算Mean_IP的标准差 mean_dm = mean(Mean_DM), sd_dm = sd(Mean_DM) # 新增:计算Mean_DM的标准差 ) %>% mutate(Class = as.factor(Class)) # 修正Class为因子类型
接下来用ggplot绘制叠加的正态分布曲线,以Mean_IP为例:
library(ggplot2) # 生成覆盖数据范围的x序列,保证曲线平滑完整 x_seq <- seq(min(pulsar_data$Mean_IP), max(pulsar_data$Mean_IP), length.out = 1000) # 构建绘图数据:为每个类别匹配对应的均值、标准差,计算密度值 plot_data <- expand.grid(x = x_seq, Class = c(0, 1)) %>% left_join(pulsar_data_summary, by = "Class") %>% mutate(density = dnorm(x, mean = mean_ip, sd = sd_ip)) # 绘制叠加分布曲线 ggplot(plot_data, aes(x = x, y = density, color = Class, fill = Class)) + geom_line(size = 1) + geom_area(alpha = 0.3, position = "identity") + # 低透明度填充展示密度 labs( x = "Mean of Integrated Profile", y = "Density", title = "Normal Distribution of Mean_IP by Class", color = "Class", fill = "Class" ) + theme_minimal()
代码说明:
x_seq生成足够密集的x值,确保曲线平滑无断层expand.grid结合left_join为每个类别匹配对应的统计量,用dnorm计算正态分布密度geom_area设置alpha=0.3实现低透明度填充,position="identity"保证曲线不重叠偏移- 若要绘制
Mean_DM的分布,只需将代码中的Mean_IP、mean_ip、sd_ip替换为Mean_DM、mean_dm、sd_dm即可
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

