在ggplot2中有条件地应用scale_fill_gradient

4

我正在使用 ggplot2 中的 geom_tilegeom_text 绘制以下数据

mydf 

   Var1 Var2        dc1 bin
1     H    G 0.93333333   0
2     G    H 0.06666667   1
3     I    G 0.80000000   0
4     G    I 0.20000000   1
5     J    G 0.33333333   1
6     G    J 0.66666667   0
7     K    G 0.57894737   1
8     G    K 0.42105263   0
9     I    H 0.80000000   0
10    H    I 0.20000000   1
11    J    H 0.25000000   0
12    H    J 0.75000000   1
13    K    H 0.20000000   0
14    H    K 0.80000000   1
15    J    I 0.12500000   0
16    I    J 0.87500000   1
17    K    I 0.32000000   0
18    I    K 0.68000000   1
19    K    J 0.28571429   0
20    J    K 0.71428571   1

我正在绘制“Var1”与“Var2”的图形,然后使用“bin”变量作为我的geom_text。目前,我已经使用变量“dc1”基于scale_fill_gradient填充了每个瓷砖。

### Plotting
ggplot(mydf, aes(Var2, Var1, fill = dc1)) + 
  geom_tile(colour="gray20", size=1.5, family="bold", stat="identity", height=1, width=1) + 
  geom_text(data=mydf, aes(Var2, Var1, label = bin), color="black", size=rel(4.5)) +
  scale_fill_gradient(low = "white", high = "firebrick3", space = "Lab", na.value = "gray20",    
  guide = "colourbar") +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_discrete(expand = c(0, 0)) +
  xlab("") + 
  ylab("") +
  theme(axis.text.x = element_text(vjust = 1),
        axis.text.y = element_text(hjust = 0.5),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_rect(fill=NA,color="gray20", size=0.5, linetype="solid"),
        axis.line = element_blank(),
        axis.ticks = element_blank(), 
        axis.text = element_text(color="white", size=rel(1.5)),
        panel.background = element_rect(fill="gray20"),
        plot.background = element_rect(fill="gray20"),
        legend.position = "none"

  ) 

以下是您需要翻译的内容:

这导致了以下情况:

current plot

我正在尝试(但不成功)根据“ bin”变量条件地填充。如果bin == 1,则希望根据“ dc1”填充。如果bin == 0 ,则希望使用“白色”填充。

这将得到以下手动创建的示例所需图:

desired plot

我尝试使用scale_fill_gradient来尝试引入第二个填充选项,但无法找到解决方法。感谢任何帮助/指针。

这是我的dfput:

structure(list(Var1 = structure(c(4L, 5L, 3L, 5L, 2L, 5L, 1L, 
5L, 3L, 4L, 2L, 4L, 1L, 4L, 2L, 3L, 1L, 3L, 1L, 2L), .Label = c("K", 
"J", "I", "H", "G"), class = "factor"), Var2 = structure(c(1L, 
2L, 1L, 3L, 1L, 4L, 1L, 5L, 2L, 3L, 2L, 4L, 2L, 5L, 3L, 4L, 3L, 
5L, 4L, 5L), .Label = c("G", "H", "I", "J", "K"), class = "factor"), 
    dc1 = c(0.933333333333333, 0.0666666666666667, 0.8, 0.2, 
    0.333333333333333, 0.666666666666667, 0.578947368421053, 
    0.421052631578947, 0.8, 0.2, 0.25, 0.75, 0.2, 0.8, 0.125, 
    0.875, 0.32, 0.68, 0.285714285714286, 0.714285714285714), 
    bin = c(0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 
    1, 0, 1)), .Names = c("Var1", "Var2", "dc1", "bin"), row.names = c(NA, 
-20L), class = "data.frame")

@Henrik - 不好意思。在制作可重现/通用示例时,我复制了旧的数据框名称。我已将其更改为mydf,在此示例中使用。 - jalapic
1个回答

6
也许可以将fill = dc1替换为fill = dc1 * bin?以下是你代码的简化版本:
ggplot(data = mydf, aes(x = Var2, y = Var1, fill = dc1 * bin, label = bin)) + 
  geom_tile() + 
  geom_text() +
  scale_fill_gradient(low = "white", high = "firebrick3")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接