【问题标题】:ggplot2 Heatmap 2 Different Color Schemes - Confusion Matrix: Matches in Different Color Scheme than Missclassificationsggplot2 热图 2 不同的配色方案 - 混淆矩阵:与错误分类不同的配色方案匹配
【发布时间】:2020-04-29 15:01:45
【问题描述】:

我为来自this answer 的混淆矩阵改编了热图。
但是我想扭转它。在对角线上(从左上到右下) 是匹配项(正确的分类)。我的目标是用黄色调色板绘制这个对角线。以及红色调色板中的不匹配(所以除了对角线中的所有瓷砖)。

在我的 plot.cm 函数中,我可以得到对角线

  cm_d$diag <- cm_d$Prediction == cm_d$Reference # Get the Diagonal
  cm_d$ndiag <- cm_d$Prediction != cm_d$Reference # Not the Diagonal

如果使用正确的geom_tile 美学,我只能获得对角线(在所需的黄色)配色方案

geom_tile( data = cm_d[!is.na(cm_d$diag), ],aes(color = Freq)) +
scale_fill_gradient(guide = FALSE,low=alpha("lightyellow",0.75), high="yellow",na.value = 'white') 

但是我无法获得 cm_d$ndiag 元素的第二个配色方案 我找到了提供new_scale()new_scale_fill() 的包ggnewscale
我厌倦了在blog 的帮助下实现它。然而,对于热图的其余部分,结果只是填充了深灰色的平铺

# adapted from https://stackoverflow.com/a/60150826/7318488
library(ggplot2)     # to plot
library(gridExtra)   # to put more
library(grid)        # plot together
library(likert)      # for reversing the factor order
library(ggnewscale)

plot.cm <- function(cm){
  # extract the confusion matrix values as data.frame
  cm_d <- as.data.frame(cm$table)
  cm_d$diag <- cm_d$Prediction == cm_d$Reference # Get the Diagonal
  cm_d$ndiag <- cm_d$Prediction != cm_d$Reference # Not the Diagonal     
  cm_d[cm_d == 0] <- NA # Replace 0 with NA for white tiles
  cm_d$Reference <-  reverse.levels(cm_d$Reference) # diagonal starts at top left

  # plotting the matrix
  cm_d_p <-  ggplot(data = cm_d, aes(x = Prediction , y =  Reference, fill = Freq))+
    scale_x_discrete(position = "top") +
    geom_tile( data = cm_d[!is.na(cm_d$diag), ],aes(color = Freq)) +
    scale_fill_gradient(guide = FALSE,low=alpha("lightyellow",0.75), high="yellow",na.value = 'white') +
    # THIS DOESNT WORK
    # new_scale("fill") +
    # geom_tile( data = cm_d[!is.na(cm_d$ndiag), ],aes(color = Freq)) +
    # scale_fill_gradient(guide = FALSE,low=alpha("red",0.75), high="darkred",na.value = 'white') +

    geom_text(aes(label = Freq), color = 'black', size = 6) +
    theme_light() +
    theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
      legend.position = "none",
      panel.border = element_blank(),
      plot.background = element_blank(),
      axis.line = element_blank())

  return(cm_d_p)
}

样本数据:
模拟插入符号混淆矩阵

library(caret)
# simulated data
set.seed(23)
pred <- factor(sample(1:7,100,replace=T))
ref<- factor(sample(1:7,100,replace=T))
cm <- caret::confusionMatrix(pred,ref)
g <- plot.cm(cm)
g

【问题讨论】:

    标签: r ggplot2 heatmap r-caret confusion-matrix


    【解决方案1】:

    我认为问题在于您指定的是 aes(color = Freq) 而不是 aes(fill = Freq。情节是你的目标吗?您还可以通过使用发散色标并创建一个新变量来简化所有这些,如果 Freq 不在对角线上,则将其标记为负数?请参阅下面的第二个示例

    # adapted from https://stackoverflow.com/a/60150826/7318488
    library(ggplot2)     # to plot
    library(gridExtra)   # to put more
    library(grid)        # plot together
    library(likert)      # for reversing the factor order
    #> Loading required package: xtable
    library(ggnewscale)
    
    plot.cm <- function(cm){
      # extract the confusion matrix values as data.frame
      cm_d <- as.data.frame(cm$table)
      cm_d$diag <- cm_d$Prediction == cm_d$Reference # Get the Diagonal
      cm_d$ndiag <- cm_d$Prediction != cm_d$Reference # Not the Diagonal     
      cm_d[cm_d == 0] <- NA # Replace 0 with NA for white tiles
      cm_d$Reference <-  reverse.levels(cm_d$Reference) # diagonal starts at top left
    
      # plotting the matrix
      cm_d_p <-  ggplot(data = cm_d, aes(x = Prediction , y =  Reference, fill = Freq))+
        scale_x_discrete(position = "top") +
        geom_tile( data = cm_d[!is.na(cm_d$diag), ],aes(fill = Freq)) +
        scale_fill_gradient(guide = FALSE,low=alpha("lightyellow",0.75), high="yellow",na.value = 'white') +
        # THIS DOESNT WORK
        new_scale("fill") +
        geom_tile( data = cm_d[!is.na(cm_d$ndiag), ],aes(fill = Freq)) +
        scale_fill_gradient(guide = FALSE,low=alpha("red",0.75), high="red",na.value = 'white') +
    
        geom_text(aes(label = Freq), color = 'black', size = 6) +
        theme_light() +
        theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
              legend.position = "none",
              panel.border = element_blank(),
              plot.background = element_blank(),
              axis.line = element_blank())
    
      return(cm_d_p)
    }
    
    library(caret)
    #> Loading required package: lattice
    # simulated data
    set.seed(23)
    pred <- factor(sample(1:7,100,replace=T))
    ref<- factor(sample(1:7,100,replace=T))
    cm <- caret::confusionMatrix(pred,ref)
    g <- plot.cm(cm)
    g
    #> Warning: Removed 8 rows containing missing values (geom_text).
    

    reprex package (v0.3.0) 于 2020 年 4 月 29 日创建

    # adapted from https://stackoverflow.com/a/60150826/7318488
    library(ggplot2)     # to plot
    library(gridExtra)   # to put more
    library(grid)        # plot together
    library(likert)      # for reversing the factor order
    #> Loading required package: xtable
    library(ggnewscale)
    
    plot.cm <- function(cm){
      # extract the confusion matrix values as data.frame
      cm_d <- as.data.frame(cm$table)
      cm_d$diag <- cm_d$Prediction == cm_d$Reference # Get the Diagonal
      cm_d$ndiag <- cm_d$Prediction != cm_d$Reference # Not the Diagonal     
      cm_d[cm_d == 0] <- NA # Replace 0 with NA for white tiles
      cm_d$Reference <-  reverse.levels(cm_d$Reference) # diagonal starts at top left
    
      cm_d$ref_freq <- cm_d$Freq * ifelse(is.na(cm_d$diag),-1,1)
    
      # plotting the matrix
      cm_d_p <-  ggplot(data = cm_d, aes(x = Prediction , y =  Reference, fill = Freq))+
        scale_x_discrete(position = "top") +
        geom_tile( data = cm_d,aes(fill = ref_freq)) +
        scale_fill_gradient2(guide = FALSE,low="red",high="yellow", midpoint = 0,na.value = 'white') +
        geom_text(aes(label = Freq), color = 'black', size = 6)+
         theme_light() +
        theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
              legend.position = "none",
              panel.border = element_blank(),
              plot.background = element_blank(),
              axis.line = element_blank())
    
      return(cm_d_p)
    }
    
    library(caret)
    #> Loading required package: lattice
    # simulated data
    set.seed(23)
    pred <- factor(sample(1:7,100,replace=T))
    ref<- factor(sample(1:7,100,replace=T))
    cm <- caret::confusionMatrix(pred,ref)
    g <- plot.cm(cm)
    g
    #> Warning: Removed 8 rows containing missing values (geom_text).
    

    reprex package (v0.3.0) 于 2020 年 4 月 29 日创建

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2020-04-19
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多