如何在cvms的plot_confusion_matrix中按行百分比设置色块颜色强度?
问题描述
我用R的cvms包中plot_confusion_matrix函数绘制混淆矩阵,希望每个色块的颜色强度代表行百分比(即真实类别下各预测类别的占比),而非原始计数。该函数虽有intensity_by参数可调颜色强度,但不支持行百分比选项。请问有没有解决办法?如果没有,能否用ggplot2复现近似的混淆矩阵图,并用行百分比作为颜色强度依据?
示例代码:
library(tidyverse) library(cvms) data(iris) # 创建含4个类别的新分类变量 set.seed(123) # 保证结果可重复 new_factor <- factor(sample(c("Class1", "Class2", "Class3", "Class4"), nrow(iris), replace = TRUE)) # 将新变量加入iris数据集 iris_new <- cbind(iris, New_Categorical_Var = new_factor) subs_all <- iris_new %>% select(Species, New_Categorical_Var) subs_all$Species <- factor(subs_all$Species) subs_all$New_Categorical_Var <- factor(subs_all$New_Categorical_Var) tbl_all <- table(subs_all) cfm_all <- as.tibble(tbl_all) plot_confusion_matrix(cfm_all, target_col = "Species" , prediction_col = "New_Categorical_Var" , counts_col = "n")
解决方案
一、cvms包的现有局限
目前cvms::plot_confusion_matrix的intensity_by参数仅支持"count"或"probability"(整体概率,非行占比),确实没有直接设置行百分比作为颜色强度的选项,暂时无法通过该函数直接实现需求。
二、用ggplot2复现需求的混淆矩阵
我们可以先手动计算行百分比,再用ggplot2绘制混淆矩阵,具体步骤如下:
1. 计算行百分比
先对真实类别(Species)分组,计算每个预测类别在对应真实类别中的占比:
library(tidyverse) # 基于原数据计算行百分比 cfm_with_row_pct <- cfm_all %>% group_by(Species) %>% mutate(row_pct = n / sum(n) * 100, # 同时保留计数和百分比的标签文本 label_text = paste0(n, "\n(", sprintf("%.1f%%", row_pct), ")")) %>% ungroup()
2. 用ggplot2绘制混淆矩阵
以row_pct作为颜色映射的依据,同时在色块中显示原始计数和行百分比:
ggplot(cfm_with_row_pct, aes(x = New_Categorical_Var, y = Species)) + # 绘制色块,颜色由行百分比决定 geom_tile(aes(fill = row_pct), color = "white") + # 添加文本标签(计数+行百分比) geom_text(aes(label = label_text), color = "black", size = 4) + # 设置颜色渐变(可根据喜好调整) scale_fill_gradient(low = "#f0f9e8", high = "#006d2c", name = "行百分比(%)") + # 调整坐标轴标签和主题 labs(x = "预测类别", y = "真实类别", title = "混淆矩阵(颜色代表行百分比)") + theme_minimal() + theme( axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5, size = 14, face = "bold") )
代码说明
geom_tile的fill参数绑定row_pct,实现颜色强度随行百分比变化;label_text整合了原始计数和行百分比,让每个色块的信息更完整;- 颜色渐变和主题可根据个人需求调整,比如更换配色方案、调整文本大小等。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

