Story mixing matrix in R using ggplot

I have two mixing matrices with calculated values ​​like true positive (tp), false positives (fp), true negatives (tn) and false negatives (fn), corresponding to two different methods. I want to introduce them as enter image description here

I believe that a facet mesh or face wrapper can do this, but it's hard for me to get started. Here are the data of two mixing matrices corresponding to method 1 and method 2

dframe<-structure(list(label = structure(c(4L, 2L, 1L, 3L, 4L, 2L, 1L, 3L), .Label = c("fn", "fp", "tn", "tp"), class = "factor"), value = c(9, 0, 3, 1716, 6, 3, 6, 1713), method = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("method1", "method2"), class = "factor")), .Names = c("label", "value", "method"), row.names = c(NA, -8L), class = "data.frame") 
+11
source share
3 answers

It could be a good start.

 library(ggplot2) ggplot(data = dframe, mapping = aes(x = label, y = method)) + geom_tile(aes(fill = value), colour = "white") + geom_text(aes(label = sprintf("%1.0f",value)), vjust = 1) + scale_fill_gradient(low = "white", high = "steelblue") 

Edited

 TClass <- factor(c(0, 0, 1, 1)) PClass <- factor(c(0, 1, 0, 1)) Y <- c(2816, 248, 34, 235) df <- data.frame(TClass, PClass, Y) library(ggplot2) ggplot(data = df, mapping = aes(x = TClass, y = PClass)) + geom_tile(aes(fill = Y), colour = "white") + geom_text(aes(label = sprintf("%1.0f", Y)), vjust = 1) + scale_fill_gradient(low = "blue", high = "red") + theme_bw() + theme(legend.position = "none") 

enter image description here

+14
source

A slightly more modular solution based on MYaseen208's answer. May be more efficient for large datasets / multi-component classification:

 confusion_matrix <- as.data.frame(table(predicted_class, actual_class)) ggplot(data = confusion_matrix mapping = aes(x = predicted_class, y = Var2)) + geom_tile(aes(fill = Freq)) + geom_text(aes(label = sprintf("%1.0f", Freq)), vjust = 1) + scale_fill_gradient(low = "blue", high = "red", trans = "log") # if your results aren't quite as clear as the above example 
+4
source

An old question, but I wrote this function, which, I think, gives a nicer answer. The result is a divergent palette (or whatever you want, but by default diverges):

 prettyConfused<-function(Actual,Predict,colors=c("white","red4","dodgerblue3"),text.scl=5){ actual = as.data.frame(table(Actual)) names(actual) = c("Actual","ActualFreq") #build confusion matrix confusion = as.data.frame(table(Actual, Predict)) names(confusion) = c("Actual","Predicted","Freq") #calculate percentage of test cases based on actual frequency confusion = merge(confusion, actual, by=c('Actual','Actual')) confusion$Percent = confusion$Freq/confusion$ActualFreq*100 confusion$ColorScale<-confusion$Percent*-1 confusion[which(confusion$Actual==confusion$Predicted),]$ColorScale<-confusion[which(confusion$Actual==confusion$Predicted),]$ColorScale*-1 confusion$Label<-paste(round(confusion$Percent,0),"%, n=",confusion$Freq,sep="") tile <- ggplot() + geom_tile(aes(x=Actual, y=Predicted,fill=ColorScale),data=confusion, color="black",size=0.1) + labs(x="Actual",y="Predicted") tile = tile + geom_text(aes(x=Actual,y=Predicted, label=Label),data=confusion, size=text.scl, colour="black") + scale_fill_gradient2(low=colors[2],high=colors[3],mid=colors[1],midpoint = 0,guide='none') } 

Confusion matrix

0
source

All Articles