ggplot2 热图 2 种不同的配色方案 - 混淆矩阵:不同配色方案中的匹配比错误分类
ggplot2 Heatmap 2 Different Color Schemes - Confusion Matrix: Matches in Different Color Scheme than Missclassifications
我为来自 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
元素的第二种配色方案
我找到了包 ggnewscale that offers new_scale()
as well as new_scale_fill()
.
I tired to implement it with the help of this blog。然而,对于热图的其余部分,结果只有深灰色填充的图块
# adapted from
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
我认为问题只是您指定的是 aes(color = Freq)
而不是 aes(fill = Freq
。情节是你的目标吗?您还可以通过使用发散色标并创建一个新变量来简化所有这些,如果它不在对角线上,则将 Freq 标记为负数?请参阅下面的第二个示例
# adapted from
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-04-29 创建
# adapted from
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-04-29 创建
我为来自 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
元素的第二种配色方案
我找到了包 ggnewscale that offers new_scale()
as well as new_scale_fill()
.
I tired to implement it with the help of this blog。然而,对于热图的其余部分,结果只有深灰色填充的图块
# adapted from
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
我认为问题只是您指定的是 aes(color = Freq)
而不是 aes(fill = Freq
。情节是你的目标吗?您还可以通过使用发散色标并创建一个新变量来简化所有这些,如果它不在对角线上,则将 Freq 标记为负数?请参阅下面的第二个示例
# adapted from
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-04-29 创建# adapted from
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-04-29 创建