如何更改此热图中的颜色?
How to change colours in this heatmap?
如有任何帮助,我将不胜感激。我使用 Pheatmap 创建了一个热图。我的措施是二元的,我希望注释行颜色(5 类)与数据点相同。目前我在 5 个类别中有一种颜色。我附上了我的代码生成的图表。我不知道该怎么做。提前致谢!
这是我的代码和示例数据:
library(pheatmap)
library(dplyr)
*Arrange cluster
spells2=spells%>%arrange(PAM_complete)
*Df for wheeze columns
whz=spells2%>%dplyr::select(2:6)
*Create separate df for cluster
c5=spells2$PAM_complete
c5=as.data.frame(c5)
*Wheeze and cluster need the same row names (id)
rownames(whz)=spells2$id
rownames(c5)=spells2$id
c5$c5=as.factor(c5$c5)
col=c("white", "darkblue")
pheatmap(whz,legend_breaks = 0:1, legend_labels = c("No wheeze", "Wheeze"), fontsize = 10,
show_rownames=FALSE, cluster_rows = FALSE, color=col,
cluster_cols=FALSE , annotation_row=c5, )
> dput(head(spells2, 50))
structure(list(id = c("10003A", "1001", "10012A", "10013A", "10016A",
"10019A", "1001A", "10023A", "1002A", "10037A", "1004", "10042A",
"10045A", "1005", "10051A", "10054A", "1006", "10064A", "10065A",
"10075A", "10076A", "10082A", "10087A", "10094A", "10095A", "10097A",
"10098A", "100A", "10103A", "10104A", "10106A", "10121A", "10124A",
"10126A", "10132A", "1013A", "10144A", "10146A", "1014A", "1015",
"10153A", "10156A", "10159A", "10161A", "1017", "10171A", "10175A",
"10178A", "1018", "10186A"), whz1 = c(0, 1, 0, 0, 0, 0, 0, 1,
0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0
), whz2 = c(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0), whz3 = c(0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 0), whz4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0), whz5 = c(0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0), PAM_complete = c("ETW", "ETW", "NWZ", "NWZ",
"LOW", "NWZ", "NWZ", "INT", "NWZ", "ETW", "NWZ", "PEW", "ETW",
"INT", "NWZ", "INT", "ETW", "NWZ", "ETW", "ETW", "NWZ", "ETW",
"ETW", "NWZ", "NWZ", "NWZ", "NWZ", "NWZ", "NWZ", "PEW", "NWZ",
"ETW", "NWZ", "INT", "NWZ", "INT", "NWZ", "INT", "NWZ", "LOW",
"PEW", "NWZ", "NWZ", "INT", "ETW", "NWZ", "ETW", "NWZ", "ETW",
"NWZ")), row.names = c(NA, -50L), class = c("tbl_df", "tbl",
"data.frame"))
>
如果我没理解错的话,下面是图“B”,但你想要图“A”(图之间没有小间隙)。这不是使用 pheatmap 包的简单任务。我用来创建下面的图“A”的方法可能适合进行一些调整(基本上,分别绘制每个组,然后将它们全部粘贴到一个列中)。否则,下面包含一个更简单的 'ggplot' 方法。
library(tidyverse)
library(pheatmap)
library(cowplot)
spells2 <- as.data.frame(spells) %>%
arrange(PAM_complete)
#Df for wheeze columns
whz <- spells2 %>%
dplyr::select(2:6)
#Create separate df for cluster
c5 <- spells2$PAM_complete %>%
as.data.frame()
colnames(c5) <- "names"
#Wheeze and cluster need the same row names (id)
rownames(whz) <- spells2$id
rownames(c5) <- spells2$id
c5$names <- as.factor(c5$names)
combined <- cbind(c5, whz)
# To get the 'default' pheatmap colour scheme
gg_color_hue <- function(n) {
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 75, c = 100)[1:n]
}
scales::show_col(gg_color_hue(5))
# Specify colours for each group
ann_colors = list(
names = c(ETW = "#FF9289", INT = "#FF8AFF",
LOW = "#00DB98", NWZ = "#00CBFF",
PEW = "#BEC100"))
# Generate the plots
col = c("grey95", "darkblue")
p <- pheatmap(whz, legend_breaks = 0:1,
legend_labels = c("No wheeze", "Wheeze"),
fontsize = 10, show_rownames = FALSE,
cluster_rows = FALSE, color = col,
cluster_cols = FALSE, annotation_row = c5)
col_1 <- c("grey95", "#FF9289")
p1 <- pheatmap(combined %>% filter(names == "ETW") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_1, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "ETW") %>% select(names))
col_2 <- c("grey95", "#FF8AFF")
p2 <- pheatmap(combined %>% filter(names == "INT") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_2, annotation_names_row = FALSE,
annotation_colors = ann_colors, cellheight = 7,
annotation_row = combined %>% filter(names == "INT") %>% select(names))
col_3 <- c("grey95", "#00DB98")
p3 <- pheatmap(combined %>% filter(names == "LOW") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_3, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "LOW") %>% select(names))
# Because all whz values = 0 for NWZ,
# you need to change one value to '1'
# in order for pheatmap to generate a plot
combined[23,2] <- 1
col_4 <- c("grey95", "grey95")
p4 <- pheatmap(combined %>% filter(names == "NWZ") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_4, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "NWZ") %>% select(names))
col_5 <- c("grey95", "#BEC100")
p5 <- pheatmap(combined %>% filter(names == "PEW") %>% select(-c(names)),
show_rownames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_5,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "PEW") %>% select(names))
heatmaps <- cowplot::plot_grid(p1[[4]], p2[[4]], p3[[4]],
p4[[4]], p5[[4]], ncol = 1,
rel_heights = c(1.3, 0.7, 0.3, 2.4, 0.8))
cowplot::plot_grid(heatmaps, p$gtable, ncol = 2, rel_widths = c(0.7, 1), labels = "AUTO")
编辑
如果你不一定要使用 pheatmap,ggplot2 geom_tile()
会容易得多,例如
library(tidyverse)
my_levels <- rownames(combined)
my_colours <- c("#FF9289", "#FF8AFF", "#00DB98", "#00CBFF", "#BEC100")
combined %>%
rownames_to_column(var = "IDs") %>%
pivot_longer(cols = -c(IDs, names),
names_to = "Trial",
values_to = "Wheeze") %>%
rename(Group = names) %>%
mutate(IDs = factor(IDs, levels = my_levels)) %>%
ggplot() +
geom_tile(aes(y = rev(IDs),
x = Trial,
fill = Group,
alpha = Wheeze),
color = "black") +
scale_alpha_continuous(breaks = c(0, 1),
labels = c("No", "Yes")) +
scale_fill_manual(values = my_colours) +
theme_minimal() +
theme(panel.grid = element_blank())
编辑 2
要在绘图前包含一个 'annotation' 条,您可以使用:
combined %>%
rownames_to_column(var = "IDs") %>%
pivot_longer(cols = -c(IDs, names),
names_to = "Trial",
values_to = "Wheeze") %>%
rename(Group = names) %>%
mutate(IDs = factor(IDs, levels = my_levels)) %>%
ggplot() +
geom_tile(aes(y = rev(IDs),
x = Trial,
fill = Group,
alpha = Wheeze),
color = "black") +
geom_tile(aes(x = -0.1, y = rev(IDs), fill = Group),
show.legend = FALSE) +
coord_cartesian(c(0.8, 5)) +
scale_fill_manual(values = my_colours) +
scale_alpha_continuous(breaks = c(0, 1),
labels = c("No", "Yes")) +
theme(plot.margin=unit(c(1,0,0,0), units="lines"))
我无法将其标记为“组”,但我想如果您修改它是可能的。
如有任何帮助,我将不胜感激。我使用 Pheatmap 创建了一个热图。我的措施是二元的,我希望注释行颜色(5 类)与数据点相同。目前我在 5 个类别中有一种颜色。我附上了我的代码生成的图表。我不知道该怎么做。提前致谢!
这是我的代码和示例数据:
library(pheatmap)
library(dplyr)
*Arrange cluster
spells2=spells%>%arrange(PAM_complete)
*Df for wheeze columns
whz=spells2%>%dplyr::select(2:6)
*Create separate df for cluster
c5=spells2$PAM_complete
c5=as.data.frame(c5)
*Wheeze and cluster need the same row names (id)
rownames(whz)=spells2$id
rownames(c5)=spells2$id
c5$c5=as.factor(c5$c5)
col=c("white", "darkblue")
pheatmap(whz,legend_breaks = 0:1, legend_labels = c("No wheeze", "Wheeze"), fontsize = 10,
show_rownames=FALSE, cluster_rows = FALSE, color=col,
cluster_cols=FALSE , annotation_row=c5, )
> dput(head(spells2, 50))
structure(list(id = c("10003A", "1001", "10012A", "10013A", "10016A",
"10019A", "1001A", "10023A", "1002A", "10037A", "1004", "10042A",
"10045A", "1005", "10051A", "10054A", "1006", "10064A", "10065A",
"10075A", "10076A", "10082A", "10087A", "10094A", "10095A", "10097A",
"10098A", "100A", "10103A", "10104A", "10106A", "10121A", "10124A",
"10126A", "10132A", "1013A", "10144A", "10146A", "1014A", "1015",
"10153A", "10156A", "10159A", "10161A", "1017", "10171A", "10175A",
"10178A", "1018", "10186A"), whz1 = c(0, 1, 0, 0, 0, 0, 0, 1,
0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0
), whz2 = c(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0), whz3 = c(0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 0), whz4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0), whz5 = c(0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0), PAM_complete = c("ETW", "ETW", "NWZ", "NWZ",
"LOW", "NWZ", "NWZ", "INT", "NWZ", "ETW", "NWZ", "PEW", "ETW",
"INT", "NWZ", "INT", "ETW", "NWZ", "ETW", "ETW", "NWZ", "ETW",
"ETW", "NWZ", "NWZ", "NWZ", "NWZ", "NWZ", "NWZ", "PEW", "NWZ",
"ETW", "NWZ", "INT", "NWZ", "INT", "NWZ", "INT", "NWZ", "LOW",
"PEW", "NWZ", "NWZ", "INT", "ETW", "NWZ", "ETW", "NWZ", "ETW",
"NWZ")), row.names = c(NA, -50L), class = c("tbl_df", "tbl",
"data.frame"))
>
如果我没理解错的话,下面是图“B”,但你想要图“A”(图之间没有小间隙)。这不是使用 pheatmap 包的简单任务。我用来创建下面的图“A”的方法可能适合进行一些调整(基本上,分别绘制每个组,然后将它们全部粘贴到一个列中)。否则,下面包含一个更简单的 'ggplot' 方法。
library(tidyverse)
library(pheatmap)
library(cowplot)
spells2 <- as.data.frame(spells) %>%
arrange(PAM_complete)
#Df for wheeze columns
whz <- spells2 %>%
dplyr::select(2:6)
#Create separate df for cluster
c5 <- spells2$PAM_complete %>%
as.data.frame()
colnames(c5) <- "names"
#Wheeze and cluster need the same row names (id)
rownames(whz) <- spells2$id
rownames(c5) <- spells2$id
c5$names <- as.factor(c5$names)
combined <- cbind(c5, whz)
# To get the 'default' pheatmap colour scheme
gg_color_hue <- function(n) {
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 75, c = 100)[1:n]
}
scales::show_col(gg_color_hue(5))
# Specify colours for each group
ann_colors = list(
names = c(ETW = "#FF9289", INT = "#FF8AFF",
LOW = "#00DB98", NWZ = "#00CBFF",
PEW = "#BEC100"))
# Generate the plots
col = c("grey95", "darkblue")
p <- pheatmap(whz, legend_breaks = 0:1,
legend_labels = c("No wheeze", "Wheeze"),
fontsize = 10, show_rownames = FALSE,
cluster_rows = FALSE, color = col,
cluster_cols = FALSE, annotation_row = c5)
col_1 <- c("grey95", "#FF9289")
p1 <- pheatmap(combined %>% filter(names == "ETW") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_1, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "ETW") %>% select(names))
col_2 <- c("grey95", "#FF8AFF")
p2 <- pheatmap(combined %>% filter(names == "INT") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_2, annotation_names_row = FALSE,
annotation_colors = ann_colors, cellheight = 7,
annotation_row = combined %>% filter(names == "INT") %>% select(names))
col_3 <- c("grey95", "#00DB98")
p3 <- pheatmap(combined %>% filter(names == "LOW") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_3, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "LOW") %>% select(names))
# Because all whz values = 0 for NWZ,
# you need to change one value to '1'
# in order for pheatmap to generate a plot
combined[23,2] <- 1
col_4 <- c("grey95", "grey95")
p4 <- pheatmap(combined %>% filter(names == "NWZ") %>% select(-c(names)),
show_rownames = FALSE, show_colnames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_4, annotation_names_row = FALSE,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "NWZ") %>% select(names))
col_5 <- c("grey95", "#BEC100")
p5 <- pheatmap(combined %>% filter(names == "PEW") %>% select(-c(names)),
show_rownames = FALSE,
cluster_rows = FALSE, cluster_cols = FALSE,
legend = FALSE, annotation_legend = FALSE,
color = col_5,
annotation_colors = ann_colors,
annotation_row = combined %>% filter(names == "PEW") %>% select(names))
heatmaps <- cowplot::plot_grid(p1[[4]], p2[[4]], p3[[4]],
p4[[4]], p5[[4]], ncol = 1,
rel_heights = c(1.3, 0.7, 0.3, 2.4, 0.8))
cowplot::plot_grid(heatmaps, p$gtable, ncol = 2, rel_widths = c(0.7, 1), labels = "AUTO")
编辑
如果你不一定要使用 pheatmap,ggplot2 geom_tile()
会容易得多,例如
library(tidyverse)
my_levels <- rownames(combined)
my_colours <- c("#FF9289", "#FF8AFF", "#00DB98", "#00CBFF", "#BEC100")
combined %>%
rownames_to_column(var = "IDs") %>%
pivot_longer(cols = -c(IDs, names),
names_to = "Trial",
values_to = "Wheeze") %>%
rename(Group = names) %>%
mutate(IDs = factor(IDs, levels = my_levels)) %>%
ggplot() +
geom_tile(aes(y = rev(IDs),
x = Trial,
fill = Group,
alpha = Wheeze),
color = "black") +
scale_alpha_continuous(breaks = c(0, 1),
labels = c("No", "Yes")) +
scale_fill_manual(values = my_colours) +
theme_minimal() +
theme(panel.grid = element_blank())
编辑 2
要在绘图前包含一个 'annotation' 条,您可以使用:
combined %>%
rownames_to_column(var = "IDs") %>%
pivot_longer(cols = -c(IDs, names),
names_to = "Trial",
values_to = "Wheeze") %>%
rename(Group = names) %>%
mutate(IDs = factor(IDs, levels = my_levels)) %>%
ggplot() +
geom_tile(aes(y = rev(IDs),
x = Trial,
fill = Group,
alpha = Wheeze),
color = "black") +
geom_tile(aes(x = -0.1, y = rev(IDs), fill = Group),
show.legend = FALSE) +
coord_cartesian(c(0.8, 5)) +
scale_fill_manual(values = my_colours) +
scale_alpha_continuous(breaks = c(0, 1),
labels = c("No", "Yes")) +
theme(plot.margin=unit(c(1,0,0,0), units="lines"))
我无法将其标记为“组”,但我想如果您修改它是可能的。