我正在尝试根据列变量为我的数据集指定不同的颜色标度。虚拟代码是
df1 <- data.frame(ID = c('a1', 'b1', 'c1', 'd1', 'e1', 'f1'),
var1 = c('a', 'b', 'c', 'a', 'b', 'c'),
var2 = c(0.006, 0.04, .005, 0, 0.02, 0.05))
而不是整体色标,我想要&#39; a&#39;从var1到红色到白色,&#39; b&#39;蓝色到白色,&#39; c&#39;紫色到白色。我的实际数据中有4000行,我试图将每个行嵌套在彼此之上,但是失败了......运行在下面。请建议我在哪里进行更改以获得所需的输出。
P.S.I我知道,如果有传说,var2会有不同的高点和低点,很棒,否则我只需要显示颜色差异。
ggplot(df1,aes(y = var1, x = ID, fill = var2)) +
geom_tile(color = "white") +
coord_equal() +
scale_fill_gradient(low = "steelblue", high = "white") +
ylab("var1") +
xlab("ID") +
theme(legend.title = element_text(size = 10),
legend.text = element_text(size = 12),
plot.title = element_text(size = 16),
axis.title = element_text(size = 14, face = "bold"),
axis.text.x = element_text(angle = 90, hjust = 1)) +
labs(fill = "ABC association")
答案 0 :(得分:1)
如果您希望每个色标采用特定颜色和白色之间的渐变,您可以通过为每个var1
值指定不同的颜色来伪造它,并根据var2改变透明度。这是一个例子,当然你可以根据你想要的结果来改变细节:
第1步。定义每个var1值的颜色。
color.scale <- c("a" = "red", "b" = "blue", "c" = "purple")
第2步。将每个var2
类别中的var1
值范围缩放到一个公共范围。
library(dplyr)
df2 <- df1 %>%
group_by(var1) %>%
mutate(var2.alpha = scale(var2)) %>%
ungroup() %>%
arrange(var1)
> df2
# A tibble: 6 x 4
ID var1 var2 var2.alpha
<fctr> <fctr> <dbl> <dbl>
1 a1 a 0.00600 0.707
2 d1 a 0 -0.707
3 b1 b 0.0400 0.707
4 e1 b 0.0200 -0.707
5 c1 c 0.00500 -0.707
6 f1 c 0.0500 0.707
第3步。创建你的情节。第一个白色geom_tile()
提供&#34;支持&#34;对于彩色图块层,以便背景元素(面板颜色,网格线等)不会显示在图块中。
p.plot <- ggplot(df2,
aes(x = ID, y = var1, fill = var1, alpha = var2.alpha)) +
geom_tile(fill = "white", alpha = 1) +
geom_tile() +
scale_fill_manual(values = color.scale) +
scale_alpha(range = c(0.1, 0.9)) +
coord_equal() +
theme_light() +
theme(legend.position = "none")
第4步。创建一个单独的图作为图例。
df3 <- df2 %>% group_by(var1) %>%
summarise(min = min(var2), max = max(var2)) %>%
mutate(tile.1 = 0.1, tile.3 = 0.3, tile.5 = 0.5, tile.7 = 0.7, tile.9 = 0.9) %>%
tidyr::gather(tile, value, -var1, -min, -max)
p.legend <- ggplot(df3, aes(x = value, y = var1, fill = var1, alpha = value)) +
geom_tile() +
geom_text(aes(label = var1), x = -0.1) +
geom_text(aes(label = min), x = 0.1) +
geom_text(aes(label = max), x = 0.9, color = "white") +
ggtitle("ABC association") +
coord_cartesian(xlim = c(-0.2, 1.1)) +
scale_fill_manual(values = color.scale) +
scale_alpha_identity() +
theme_void() +
theme(legend.position = "none")
第5步。将两者结合起来,为主图分配更多空间。
cowplot::plot_grid(p.plot, p.legend,
ncol = 1, align = "v",
rel_heights = c(5, 1))