簡體   English   中英

在 geom_tile ggplot2 上將對角元素設置為某種顏色

[英]set diagonal elements to a certain color on geom_tile ggplot2

我想生成一個混淆矩陣 plot ,其中對角線條目為綠色,零條目為白色,非對角線非零條目應為紅色。

這是數據:

gg <- structure(list(Prediction = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L), .Label = c("0", "1", "2", "3", "4", "5", "6", 
"7", "8", "9"), class = "factor"), Reference = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L), .Label = c("0", "1", "2", "3", "4", 
"5", "6", "7", "8", "9"), class = "factor"), Freq = c(93L, 7L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 100L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 2L, 89L, 6L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 1L, 98L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 26L, 0L, 0L, 71L, 0L, 0L, 
3L, 0L, 0L, 2L, 69L, 0L, 0L, 1L, 25L, 0L, 3L, 0L, 0L, 6L, 64L, 
0L, 0L, 0L, 0L, 30L, 0L, 0L, 0L, 1L, 13L, 0L, 0L, 0L, 0L, 0L, 
86L, 0L, 0L, 3L, 96L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 4L, 37L, 
0L, 0L, 5L, 0L, 0L, 54L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-100L))

在此示例中,非對角線零是白色的。 但是我怎樣才能故意將對角線設置為綠色和非零非對角線紅色?

gg %>% dplyr::mutate(Freq2 = ifelse(Freq == 0,NA,Freq)) %>% 
    ggplot(aes(Prediction, Reference, fill = Freq2)) +
    geom_tile() + 
    geom_text(aes(label=Freq)) +
    scale_fill_gradientn(colours = c("#f8766d", "#00ba38"),na.value="white") +
    labs(x = "Prediction",y = "Reference", fill = "Freq")

在此處輸入圖像描述

弄清楚了。 不得不使用 scale_fill_manual

gg2 <- gg %>% dplyr::mutate(Freq2 = ifelse(Freq == 0,NA,Freq)) 
gg2[gg2$Prediction == gg2$Reference,]$Freq2 = "diag"
gg2[gg2$Prediction != gg2$Reference & !is.na(gg2$Freq2),]$Freq2 = "notDiag"
gg2 %>%
    ggplot(aes(Prediction, Reference, fill = Freq2)) +
    geom_tile() + 
    geom_text(aes(label=Freq)) +
    scale_fill_manual(values=c("#00ba38", "#f8766d"),na.value="white")+ 
    labs(x = "Prediction",y = "Reference", fill = "Freq")

在此處輸入圖像描述

使用scale_fill_identity一種選擇 -

library(dplyr)
library(ggplot2)

gg %>% 
  mutate(color = case_when(Prediction == Reference ~ 'green', 
                           Freq == 0 ~ 'white', 
                           TRUE ~ ' red')) %>%
  ggplot(aes(Prediction, Reference, fill = color)) +
  geom_tile() + 
  geom_text(aes(label=Freq)) +
  scale_fill_identity() + 
  labs(x = "Prediction",y = "Reference")

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM