使用 ggplot2 将混淆矩阵绘制为堆叠条形图

plot confusion matrix as stacked bar chart with ggplot2

我有一个混淆矩阵,我想用 ggplot2 绘制成堆叠条形图。

# confusion matrix
conf <- structure(c(3015, 672, 874, 3217, 0.224736436101826, 0.1727950629982
), .Dim = 2:3, .Dimnames = list(c("FALSE", "TRUE"), c("FALSE", 
"TRUE", "class.error")))

conf
#       FALSE TRUE class.error
# FALSE  3015  874   0.2247364
# TRUE    672 3217   0.1727951

我尝试使用 tidyr 重塑它:

conf <- as.data.frame(rf$confusion)
conf$actual <- row.names(conf)
conf <- tidyr::pivot_longer(conf, c(`FALSE`, `TRUE`))
conf$prediction <- conf$name

然后绘图使用:

ggplot(conf, aes(x = actual, fill = prediction)) + geom_bar(position = "fill")

实际输出:


但是有几个问题:

  1. 根据我的混淆矩阵
  2. value列,条形应该有高度
  3. 正确预测部分的颜色应显示为 green,错误预测部分的颜色应显示为 red

我该如何解决这个问题?


也感谢简化方法中的任何帮助..

默认情况下,geom_bar() 会计算统计数据,这意味着它会计算 TRUE/FALSE 的数量,从而得出 1:1。所以你可以使用 geom_col() 或 geom_bar(stat="identity") 而不是

尝试这样的事情:

g <- data.frame(conf[,1:2]) %>% 
tibble::rownames_to_column("observed") %>% 
pivot_longer(-observed,names_to = "predicted") %>% 
ggplot() + geom_col(aes(x=observed,y=value,fill=predicted))
print(g)

对于真红/绿:

#set the colors
# note you have FALSE. and TRUE. in your matrix
COLS = c("TRUE."="green","FALSE."="red")
g + scale_fill_manual(values = COLS)

加载包

library(tidyverse)

那么这就是你的矩阵。

conf <- structure(c(3015, 672, 874, 3217, 0.224736436101826, 0.1727950629982
), .Dim = 2:3, .Dimnames = list(c("FALSE", "TRUE"), c("FALSE", 
                                                      "TRUE", "class.error")))

conf %>% # take the matrix then
    as.data.frame() %>% # convert it into a dataframe
    select(-class.error) %>% # remove the class.error column
    mutate(actual = rownames(.)) %>% # make the rownames a column
    gather(key = "predicted", value = "obs", -actual) %>% # put the data into a long format
    ggplot(aes(actual, obs, fill = predicted)) + # plot with these aesthetics
    geom_bar(stat = "identity")

stat = "identity" 部分很重要,因为 ggplot 以其他方式寻找行数,但您想要 行中。