使用 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")
实际输出:
但是有几个问题:
- 根据我的混淆矩阵
的value
列,条形应该有高度
- 正确预测部分的颜色应显示为
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
以其他方式寻找行数,但您想要 在 行中。
我有一个混淆矩阵,我想用 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")
实际输出:
但是有几个问题:
- 根据我的混淆矩阵 的
- 正确预测部分的颜色应显示为
green
,错误预测部分的颜色应显示为red
value
列,条形应该有高度
我该如何解决这个问题?
也感谢简化方法中的任何帮助..
默认情况下,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
以其他方式寻找行数,但您想要 在 行中。