在 ggplot2 中将不同颜色的零点绘制为色标

Plot zeros in a different colour to colour scale in ggplot2

我有一个数据框,df:

df <- structure(list(animal = c("cat", "cat", "cat", "cat", "cat", 
"cat", "cat", "cat", "cat", "cat", "cat", "cat", "cat", "cat", 
"cat", "cat", "cat", "cat"), id = c("201", "202", "203", "204", 
"215", "217", "201", "202", "203", "204", "215", "217", "201", 
"202", "203", "204", "215", "217"), tissue = c("tail", "tail", 
"tail", "tail", "tail", "tail", "whiskers", "whiskers", "whiskers", 
"whiskers", "whiskers", "whiskers", "feet", "feet", "feet", "feet", 
"feet", "feet"), value = c(0.5, 2.2, 0, 0.2, 0, 0, 2.8, 19.9, 
0, 85, 0, 0, 1.9, 4.1, 0, 0.4, 0, 120)), row.names = c(NA, -18L
), class = "data.frame")

head(df)
  animal  id tissue value
1    cat 201   tail   0.5
2    cat 202   tail   2.2
3    cat 203   tail   0.0
4    cat 204   tail   0.2
5    cat 215   tail   0.0
6    cat 217   tail   0.0

我有以下绘图功能:

p <- ggplot(df, aes_string(x = "id", y = "tissue", fill = "value")) +
    geom_tile(color = "white") +
    geom_text(aes_string(label = "value"), color = "black", size = 2) +
    scale_fill_gradient(
        low = "white", high = "red", na.value = "#D0D0D0") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

这会产生:

我希望零值以白色绘制,但任何高于零的值都从淡红色开始(例如#FEECE3)。

我试过这个:

p <- ggplot(df, aes_string(x = "id", y = "tissue", fill = "value")) +
    geom_tile(color = "white") +
    geom_text(aes_string(label = "value"), color = "black", size = 2) +
            scale_fill_gradient2(
                low = "white", mid = "#FEECE3", high = "red", na.value = "#D0D0D0",
                midpoint = 1) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

但是它以灰红色绘制了零点。

我怎样才能让零点以白色绘制?

您可以使用 scale_fill_gradientn。将三种颜色设置为白色、off-white 和红色,并将它们达到这些颜色的值设置为 0、最小可能的 non-zero 数字和 1.

ggplot(df, aes_string(x = "id", y = "tissue", fill = "value")) +
  geom_tile(color = "white") +
  geom_text(aes_string(label = "value"), color = "black", size = 2) +
  scale_fill_gradientn(colours = c('white', "#FEECE3", 'red'),
                       values = c(0, .Machine$double.eps, 1)) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))