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”,但没有骰子。
非常感谢您的帮助!
与其同时使用 fill
和 alpha
,一种选择是仅使用 fill
,如下所示:
- 将具有所需填充颜色的列添加到数据集中,例如使用
left_join
.
- 手动计算您的
alpha
水平,例如使用cut
.
- 使用
colorspace::adjust_transparency
根据 alpha 值调整颜色的透明度
- 将生成的颜色映射到
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()
)
有很多与此主题相关的问题,但到目前为止,我尝试过的答案中 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”,但没有骰子。
非常感谢您的帮助!
与其同时使用 fill
和 alpha
,一种选择是仅使用 fill
,如下所示:
- 将具有所需填充颜色的列添加到数据集中,例如使用
left_join
. - 手动计算您的
alpha
水平,例如使用cut
. - 使用
colorspace::adjust_transparency
根据 alpha 值调整颜色的透明度
- 将生成的颜色映射到
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()
)