R ggplot热图,多行在同一图形上具有单独的图例

Jak*_*eln 5 r legend scale heatmap ggplot2

我正在尝试使用 ggplot2 制作一张热图,其中包含 3 种类型的变量,每个变量都需要自己独立的图例/比例。

我能够将它们全部绘制在一张热图中(如下图所示),但我无法将它们分开以拥有自己的图例。我的三个类别是行“Score”、“samp1”和其余数据。我希望每个人都有自己独立的传奇,以及各自的范围。

我唯一的补充是让行得分有一个绿色、黄色、红色(低、中、高)配色方案,如果这可以包含在这个问题中的话。

到目前为止我所拥有的图像

这是我用来创建该图的代码

library(ggplot2)
test_data <- read.csv("test_table.csv", row.names = 1)

ggplot(test_data, aes(x=sample, y=id, fill = value)) + 
  geom_raster() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), # lables vertical
        strip.text.y = element_blank()) +  #remove facet bar on y 
  scale_fill_gradient(low = "darkblue", high = "lightblue") +
  ggtitle("test table") +
  facet_grid(rows = vars(test_data$category), 
             cols = vars(test_data$group), scales = "free", space="free_y") #facets to add gaps 
Run Code Online (Sandbox Code Playgroud)

我已经使用 facets 按样本和我上面描述的 3 个类别来分离数据。我也希望使用这个分组来创建他们自己的图例,但我不确定这是否可行。

单击此处下载数据(预熔化)。

先感谢您。

ste*_*fan 6

ggnewscale这可以通过像这样的包来实现:

library(ggplot2)
library(dplyr)
library(ggnewscale)

ggplot() +
  geom_raster(data = filter(test_data, category == "1 score"), aes(x = sample, y = id, fill = value)) +
  scale_fill_gradient2(low = "green", mid = "yellow", high = "red", midpoint = 4, name = "Score") +
  new_scale_fill() +
  geom_raster(data = filter(test_data, category == "2 samp1"), aes(x = sample, y = id, fill = value)) +
  scale_fill_gradient(low = "darkblue", high = "lightblue", name = "Sample1") +
  new_scale_fill() +
  geom_raster(data = filter(test_data, category == "3 samp2"), aes(x = sample, y = id, fill = value)) +
  scale_fill_gradient(low = "darkblue", high = "lightblue", name = "Sample2") +
  ggtitle("test table") +
  facet_grid(
    rows = vars(category),
    cols = vars(group), scales = "free", space = "free_y"
  ) +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
    strip.text.y = element_blank()
  )
Run Code Online (Sandbox Code Playgroud)