Logistic回归二分类性能直方图绘制问题求助(R语言)
问题分析
你的代码核心问题在于基础R的hist()函数的col参数用于给直方图的柱子上色,而非单个数据点。你当前的couleurs向量是每个样本的颜色标记,直接传给col会导致颜色被错误分配(比如柱子会循环使用颜色向量,而非按样本类别对应),因此出现颜色匹配不符合预期的情况。
解决方案
我们需要先将数据按预测类别(VP/FP)分组,再分别绘制直方图并叠加,或者使用更适合分类可视化的ggplot2包来实现。
方法1:基础R实现叠加直方图
先对每个类别提取对应的预测概率,然后依次绘制直方图并指定颜色:
data <- data.frame(y_true = test$MRD, y_pred = predict(m, newdata = test, type = "response")) seuil <- 0.5 # 两个类别阈值相同,无需分开定义 # 按类别分组提取预测概率 vp0 <- data$y_pred[data$y_true == 0 & data$y_pred < seuil] fp0 <- data$y_pred[data$y_true == 1 & data$y_pred < seuil] vp1 <- data$y_pred[data$y_true == 1 & data$y_pred >= seuil] fp1 <- data$y_pred[data$y_true == 0 & data$y_pred >= seuil] # 先绘制第一个组的直方图,设置好参数 hist(vp0, col = adjustcolor("green", alpha.f = 0.7), # 半透明色避免遮挡 main = "Histogramme des Probabilités Prédites", xlab = "Probabilité Prédite", ylab = "Nombre de Patients", border = "black", ylim = c(0, 15), breaks = seq(0, 1, by = 0.1)) # 统一分组区间,保证对齐 # 叠加其他组的直方图 hist(fp0, col = adjustcolor("red", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1)) hist(vp1, col = adjustcolor("blue", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1)) hist(fp1, col = adjustcolor("orange", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1)) # 添加图例 legend("topright", legend = c("VP_0 (MRD阴真阴性)", "FP_0 (MRD阳假阴性)", "VP_1 (MRD阳真阳性)", "FP_1 (MRD阴假阳性)"), fill = c("green", "red", "blue", "orange"), alpha = 0.7)
方法2:ggplot2实现(更简洁直观)
ggplot2支持直接按分类变量映射颜色,无需手动分组:
library(ggplot2) library(dplyr) data <- data.frame(y_true = test$MRD, y_pred = predict(m, newdata = test, type = "response")) seuil <- 0.5 # 创建分类标签列 data$category <- case_when( data$y_true == 0 & data$y_pred < seuil ~ "VP_0 (MRD阴真阴性)", data$y_true == 1 & data$y_pred < seuil ~ "FP_0 (MRD阳假阴性)", data$y_true == 1 & data$y_pred >= seuil ~ "VP_1 (MRD阳真阳性)", data$y_true == 0 & data$y_pred >= seuil ~ "FP_1 (MRD阴假阳性)", TRUE ~ "其他" ) # 绘制直方图 ggplot(data, aes(x = y_pred, fill = category)) + geom_histogram(binwidth = 0.1, color = "black", alpha = 0.7, position = "stack") + # stack为堆叠,也可用dodge并排 scale_fill_manual(values = c("VP_0 (MRD阴真阴性)" = "green", "FP_0 (MRD阳假阴性)" = "red", "VP_1 (MRD阳真阳性)" = "blue", "FP_1 (MRD阴假阳性)" = "orange")) + labs(title = "Histogramme des Probabilités Prédites", x = "Probabilité Prédite", y = "Nombre de Patients") + ylim(0, 15) + theme_minimal()
关键说明
- 基础R方法中必须统一
breaks参数,确保所有直方图的分组区间一致,否则叠加会错位。 - 使用
adjustcolor()设置半透明色(alpha.f),可避免不同组的柱子互相遮挡。 - ggplot2方法更易维护,分类标签和颜色映射直接关联,不易出错。
内容的提问来源于stack exchange,提问作者DoctorBlood
相关产品推荐
相关产品推荐

