r - ggplot2混淆矩阵条件填充
问题描述
我希望混淆矩阵有两个不同的尺度。对于真正的正面/负面,我希望绿色代表高,红色代表低。对于错误的结果,我希望颜色反转。这可能需要两个传说?这可能解释起来很麻烦,但我觉得倒过来的颜色更直观。您的真实结果应该很高(绿色代表良好),而您的负面结果应该很低(在这种情况下绿色代表良好)。
如果除了我的建议之外还有其他建议或最佳实践,我愿意接受其他选择。
library(caret)
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))
cm$table %>%
data.frame() %>%
mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
group_by(Reference) %>%
mutate(total = sum(Freq)) %>%
ungroup() %>%
ggplot(aes(Reference, Prediction, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq), size = 8) +
scale_fill_gradient(low = "#ea4434", high = "#badb33") +
scale_x_discrete(position = "top") +
geom_tile(color = "black", fill = "black", alpha = 0)
我根据一些评论添加了我的问题:我希望不相关的对角线为白色,红色(低)和绿色(高)比例仅适用于真正的正面/负面结果。例如,下面的图部分实现了这一点,除了我将低点设置为白色......我希望低点为红色,而白色方块保持白色。
library(reprex)
library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))
cm$table %>%
data.frame() %>%
mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
group_by(Reference) %>%
mutate(
total = sum(Freq),
frac_fill = if_else(Prediction == Reference, Freq / total, 0),
frac = Freq / total * frac_fill
) %>%
ggplot(aes(Prediction, Reference, fill = frac_fill)) +
geom_tile() +
geom_text(aes(label = str_c(Freq, ", ", round(frac * 100), "%")), size = 8) +
scale_fill_gradient(low = "white", high = "#badb33") +
scale_x_discrete(position = "top") +
geom_tile(color = "black", fill = "black", alpha = 0)
解决方案
如果我理解正确,您需要一个不同的比例,这需要将比例设为负数和正数。我做了一个变量frac_directed
,如果预测是“坏的”,它就是否定的frac_fill
,尽管这可能与你正在寻找的相反。然后使用scale_fill_gradient2
代替scale_fill_gradient
,您可以设置一个中点(默认为 0,此处适用)和一个中间填充值。
library(caret)
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))
cm$table %>%
data.frame() %>%
mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
group_by(Reference) %>%
mutate(
total = sum(Freq),
frac_fill = if_else(Prediction == Reference, Freq / total, 0),
frac = Freq / total * frac_fill
) %>%
mutate(frac_directed = if_else(Prediction == "Bad", frac_fill * -1, frac_fill)) %>%
ggplot(aes(Prediction, Reference, fill = frac_directed)) +
geom_tile(color = "black") +
geom_text(aes(label = str_c(Freq, ", ", round(frac * 100), "%")), size = 8) +
scale_fill_gradient2(low = "red", mid = "white", high = "#badb33") +
scale_x_discrete(position = "top")
由reprex 包(v0.2.0)于 2018 年 7 月 9 日创建。
推荐阅读
- angular - 在 AWS 中连接前端到后端
- reactjs - 属性值预期的字符串类型,但为空
- google-apps-script - 如何以谷歌脚本代码的形式编写特定公式
- mysql - 在组内均匀分布行
- phaser-framework - Phaser 3 - 将形状固定到相机视图中
- php - 未找到 htaccess URL
- r - 如何在igraph R中获取选定边的顶点
- linux - SSL 库错误:错误:SSL 例程:ssl3_get_client_hello:no shared cipher - 过于严格的 SSLCipherSuite 或使用 DSA 服务器证书
- node.js - 我正在通过 mongoose 为数据库编写代码,但在终端 mongoose.connection.on 错误上出现此错误
- jmeter - Jmeter什么时候释放对象?