如何在ggplot2中为数据集指定多个色阶;为每个列变量分配不同的颜色标度

时间:2018-04-05 05:29:26

标签: r ggplot2

我正在尝试根据列变量为我的数据集指定不同的颜色标度。虚拟代码是

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") 

1 个答案:

答案 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")

p.plot

第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")

p.legend

第5步。将两者结合起来,为主图分配更多空间。

cowplot::plot_grid(p.plot, p.legend, 
                   ncol = 1, align = "v", 
                   rel_heights = c(5, 1))

combined plot