Reputation:
I am trying to make a heatmap in R for species in a family of microorganisms with samplesID as x, species names as y, and two faceting factor groups at the top. I want something like the picture below
Here is what I have been able to do so far:
ad = tidyr::pivot_wider(Intrasporangiaceae, names_from = 'Species',values_from='Abundance')
ad[is.na(ad)] <- 0
ad = as.matrix(ad[,-c(1:11)])
adscaled <- scale(ad)
Aclust <- hclust(dist(t(ad)))
ggplot(Intrasporangiaceae, aes(Sorghum_Variety, Species, fill = Abundance)) +
geom_tile(width=1.0) +
facet_grid(~Striga_Infestation_Status) +
scale_fill_gradientn(name= 'Abundance',
colours = c("#373898ff", "pink","#c11630ff"),
values = c(0,0.1,1), expand = c(0,0), limit = c(0,NA)) +
scale_y_discrete(limits = colnames(ad)[Aclust$order]) +
labs(title = paste('Species Abundance in', family_Name), x='', y='') +
theme(legend.position='right',panel.background=element_blank(),
axis.line = element_blank(),
axis.ticks = element_blank(),
axis.text.x = element_text(size = 8,angle = 90, hjust = 1),
axis.text.y= element_markdown(),
legend.text = element_text(size=7),
legend.key.height = unit(10,'pt'),
legend.title = element_text(size = 10),
strip.text = element_text(size = 10),
axis.title.x = element_text(size = 8),
axis.title.y = element_text(size = 10),
plot.title = element_text(size=15, hjust = 0.5)) +
coord_fixed(ratio = 0.5) +
theme(panel.spacing = unit(0.04, 'lines'))
What I want: I look forward to your help. Thanks in advance. A sample data is available here: https://drive.google.com/file/d/1Y-D2h3mYNOpBjAPaqdLmTcGtHtOS-F2z/view?usp=sharing`
Upvotes: 0
Views: 129
Reputation: 195
I recently developed a ggplot2 extension ggalign by providing advanced tools for aligning and organizing multiple plots, particularly those that automatically reorder observations, such as dendrogram. It offers fine control over layout adjustment and plot annotations, enabling you to create complex, publication-quality visualizations while still using the familiar grammar of ggplot2.
if you are interested, please check it out at https://github.com/Yunuuuu/ggalign!
For documents of the release version, please see https://yunuuuu.github.io/ggalign/, for documents of the development version, please see https://yunuuuu.github.io/ggalign/dev/.
The development version now seamlessly integrates with maftools and supports magick rasterization.
Though it now cannot support nested facet, it's easy to add the feature. I'm not sure if nested facet is an urgent need since we can use tile to indicates groups easily.
data <- readr::read_csv("intrapsoragiaceae.csv")
ad <- tidyr::pivot_wider(data,
id_cols = "Sample",
names_from = "Species", values_from = "Abundance"
)
names(ad)
ad <- t(as.matrix(tibble::column_to_rownames(ad, "Sample")))
facetted_data <- dplyr::select(
data, Sample,
Sorghum_Variety, Striga_Infestation_Status
)
facetted_data <- unique(facetted_data)
facetted_data <- facetted_data[match(colnames(ad), facetted_data$Sample), ]
colnames(ad) == facetted_data$Sample
ggheatmap(ad, height = 1) +
theme(axis.text.x = element_text(angle = -60, hjust = 0)) +
anno_top(size = 0.1) +
align_group(facetted_data$Sorghum_Variety) +
ggalign(data = NULL) +
geom_tile(aes(.x, 1, fill = .panel)) +
scale_fill_brewer(name = "Sorghum Variety", palette = "Dark2") +
ggalign(data = NULL) +
plot_data(function(x) {
x$group <- facetted_data$Striga_Infestation_Status[x$.index]
x
}) +
geom_tile(aes(.x, 1, fill = group)) +
scale_fill_brewer(name = "Striga Infestation", palette = "Set1") +
anno_right(size = 0.2) +
align_dendro() &
theme(plot.margin = margin())
Upvotes: 1
Reputation: 3854
The ggh4x
package can help you create a heat map with nested facets:
Since coord_fixed
is incompatible with free scales in facet_
functions, you can specify the desired aspect ratio as one of your theme's components.
library(ggplot2)
aspect_ratio <- length(unique(df$Species))
ggplot(df, aes(SampleID, Species, fill = Abundance)) +
geom_tile(width = 1, height = 1) +
scale_fill_gradientn(name= 'Abundance',
colours = c("#373898ff", "pink","#c11630ff"),
values = c(0,0.1,1), expand = c(0,0), limit = c(0,NA)) +
ggh4x::facet_nested(~ Sorghum_Variety + Striga_Infestation_Status,
space = 'free_x',
scales = 'free_x'
) +
labs(y = '') +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.text.y = element_text(angle = -45, vjust = 1),
aspect.ratio = aspect_ratio,
legend.position = 'bottom')
Upvotes: 0