ggplot2:结合填充和 alpha 图例

ggplot2: combine fill and alpha legends

有很多与此主题相关的问题,但到目前为止,我尝试过的答案中 none 对我有用。

我有一个 heatmap 图,填充和 alpha 映射到不同的值,即我的数据中的不同变量创建不同的颜色和 alpha 值。想来个成品看看这个图值不值,暂时先不讨论这个好不好

我想要做的是结合我的填充和 alpha 图例,这样我就有四种不同的蓝色透明度、四种不同的红色透明度和黄色透明度。我可以单独得到那些传说,或者只是其中之一,但不能合二为一。

到目前为止,我对代码的最佳猜测是

dummy <- data.frame(model=c(rep("X",23),rep("Y",23)), 
                    longvarname=rep(c("CBH","NDMI","CovType","CH","CBD","NDVI_NF_750","Slope","TPI_Valley_1200", "TPI_Ridge_1200",
                                      "TPI_Ridge_100","TPI_Valley_100", "TSHarv","Treat","RxBurn",
                                      "TSTreat","TSRx","Deficit","SpecHumid","MaxRH","MinTemp","MaxTemp", "MaxGustDir", "MaxGustSpd"),2),
                    vargrp=rep(c(rep("Veg",6), rep("Topo",5), rep("Mgmt",5),rep("Clim",7)),2),
                    value=runif(46, min=0, max=1),
                    binary_slope=sample(c("negative","positive", "zero"), 46, replace=TRUE))

ggplot(dummy, aes(x=model, y=longvarname)) +
  geom_tile(aes(fill=binary_slope, alpha=value))+ 
  scale_alpha_binned(breaks=c(0.4, 0.6, 0.8, 1))+
  facet_grid(vargrp~., scales='free_y', space="free_y")+
  xlab("Model")+
  ylab("Variable")+
  scale_fill_manual(values=c("midnightblue","yellow1","red4"))+
  # guides(fill=guide_legend(override.aes = list(fill=c(rep("#191970",4),
  #                                                     rep("#FFEA00",4),
  #                                                     rep("#8b0000",4)),
  #                                              alpha=rep(c(0.4,0.6,0.8,1),3))))+
  theme(panel.background = element_blank(),
        axis.text.x = element_text(angle = 45, hjust=1),
        strip.text.y = element_blank(), 
        axis.ticks = element_blank()) 

上面的代码生成了两个图例,您可以在我附加的示例中看到它们。如果您取消注释 guides() 行,我得到的错误是 Error in [[<-.data.frame(*tmp*, i, value = c("#191970", "#191970", : 替换有 12 行,数据有 3. 但是我的大部分努力只导致了 alpha=1 处的填充图例。另一个我认为可能会让我到达那里的想法是在 guides() 中,将 alpha 十六进制代码放在每个颜色十六进制代码的前面,然后使 alpha guide =“none”,但没有骰子。

非常感谢您的帮助!

与其同时使用 fillalpha,一种选择是仅使用 fill,如下所示:

  1. 将具有所需填充颜色的列添加到数据集中,例如使用left_join.
  2. 手动计算您的 alpha 水平,例如使用cut.
  3. 使用 colorspace::adjust_transparency
  4. 根据 alpha 值调整颜色的透明度
  5. 将生成的颜色映射到 fill aes 上并使用 scale_fill_identity。添加 guide=guide_legend 以获得图例。

library(ggplot2)
library(dplyr)
library(colorspace)

cols <- c(negative = "midnightblue", positive = "yellow1", zero = "red4")
cols <- tibble::enframe(cols, name = "binary_slope", value = "fill")

dummy <- left_join(dummy, cols, by = "binary_slope")
dummy <- mutate(dummy,
  alpha = cut(value, breaks = c(0, 0.4, 0.6, 0.8, 1), labels = c(0.4, 0.6, 0.8, 1)),
  alpha = as.numeric(as.character(alpha)),
  fill = colorspace::adjust_transparency(fill, alpha)
)

ggplot(dummy, aes(x = model, y = longvarname)) +
  geom_tile(aes(fill = fill)) +
  scale_fill_identity(guide = guide_legend()) +
  facet_grid(vargrp ~ ., scales = "free_y", space = "free_y") +
  xlab("Model") +
  ylab("Variable") +
  theme(
    panel.background = element_blank(),
    axis.text.x = element_text(angle = 45, hjust = 1),
    strip.text.y = element_blank(),
    axis.ticks = element_blank()
  )