I have these two plots (a heatmap and a stacked barplot). How can I put these plots near each other? Indeed I want to integrate these two plots.
Thanks for any help.
Here is my script:
df.bar <- data.frame(Gene.name=c('Gene1','Gene1','Gene1','Gene2','Gene2','Gene2','Gene3','Gene3','Gene3',
'Gene4','Gene4','Gene4'),
Alteration.frequency=c(0.0909, 2.1838, 0.6369, 0.1819, 1.0919, 0.3639, 0.4549,0.7279,
0.7279, 0.000, 0.3639, 0.4549),
Alteration.Type=c("Deep deletion", "Amplification", "Point mutation", "Deep deletion",
"Amplification", "Point mutation", "Deep deletion", "Amplification" ,
"Point mutation", "Deep deletion", "Amplification" , "Point mutation"))
library(ggplot2)
ggplot(df.bar,
aes(fill=factor(Alteration.Type, levels = c('Point mutation','Amplification','Deep deletion')),
y=Alteration.frequency, x=Gene.name)) +
geom_bar(position="stack", stat="identity")+theme_bw()+
theme(axis.text.x = element_text(size = 10, angle = 45, hjust = 1, colour = 'black'))+
scale_fill_manual(values=c("seagreen2", "maroon2",'deepskyblue3'))+
labs(fill = 'Alteration type')
df.heatmap <- data.frame(Gene_name=c('Gene1','Gene2','Gene3','Gene4'),
log2FC=c(0.56,-1.5,-0.8,2))
library(gplots)
heatmap.2(cbind(df.heatmap$log2FC, df.heatmap$log2FC), trace="n", Colv = NA,
dendrogram = "none", labCol = "", labRow = df$Gene_name, cexRow = 0.75,
col=my_palette)
I need such this plot.
There are various ways to mix base R graphics like heatmap.2
and grid-based graphics like ggplot
, but this case is a little more complex due to the fact that heatmap.2
seems to use multiple plotting regions. However, the following solution should do the trick:
library(gplots)
library(ggplot2)
library(patchwork)
library(gridGraphics)
p1 <- ggplot(df.bar,
aes(fill = factor(Alteration.Type, levels = c('Point mutation',
'Amplification',
'Deep deletion')),
y = Alteration.frequency, x = Gene.name)) +
geom_col(position = "stack") +
theme_bw() +
theme(axis.text.x = element_text(size = 10, angle = 45, hjust = 1,
colour = 'black')) +
scale_fill_manual(values = c("seagreen2", "maroon2", 'deepskyblue3')) +
labs(fill = 'Alteration type')
heatmap.2(cbind(df.heatmap$log2FC, df.heatmap$log2FC), trace = "n",
Colv = NA, dendrogram = "none", labCol = "",
labRow = df.heatmap$Gene_name, cexRow = 0.75,
col = colorRampPalette(c("red", "white", "blue")))
grid.echo()
p2 <- wrap_elements(grid.grab())
p1 + p2
Edit
From the comments, it seems we want one plot on top of the other, and that the OP was using heatmap.2
because it didn't seem possible to get a single variable heatmap in ggplot.
This edit solves both these issues:
library(ggplot2)
library(patchwork)
p1 <- ggplot(df.bar,
aes(fill = factor(Alteration.Type, levels = c('Point mutation',
'Amplification',
'Deep deletion')),
y = Alteration.frequency, x = Gene.name)) +
geom_col(position = "stack") +
theme_bw() +
theme(axis.text.x = element_blank()) +
scale_fill_manual(values = c("seagreen2", "maroon2", 'deepskyblue3')) +
labs(fill = 'Alteration type', x = NULL)
p2 <- ggplot(df.heatmap, aes(y = "A", x = Gene_name,
fill = log2FC)) +
geom_tile() +
scale_fill_viridis_c() +
scale_y_discrete(NULL, position = "right") +
scale_x_discrete(NULL, expand = c(0.17, 0.1)) +
theme_minimal() +
theme(axis.text.y = element_blank(),
plot.title = element_blank())
p1 / p2 + plot_layout(height = c(3, 1))