| name | bio-data-visualization-ggplot2-fundamentals |
| description | Create publication-quality scientific figures with ggplot2 including scatter plots, boxplots, heatmaps, and multi-panel layouts. Use when creating static figures for papers, presentations, or reports in R. |
| tool_type | r |
| primary_tool | ggplot2 |
ggplot2 Fundamentals
Basic Structure
library(ggplot2)
ggplot(data, aes(x = var1, y = var2)) +
geom_point()
Common Geoms
ggplot(df, aes(x, y)) + geom_point()
ggplot(df, aes(x, y)) + geom_line()
ggplot(df, aes(x, y)) + geom_col()
ggplot(df, aes(x)) + geom_bar()
ggplot(df, aes(group, value)) + geom_boxplot()
ggplot(df, aes(group, value)) + geom_violin()
ggplot(df, aes(x)) + geom_histogram(bins = 30)
ggplot(df, aes(x, fill = group)) + geom_density(alpha = 0.5)
ggplot(df, aes(x, y, fill = value)) + geom_tile()
Aesthetic Mappings
ggplot(df, aes(x, y, color = group)) + geom_point()
ggplot(df, aes(x, y, size = value)) + geom_point()
ggplot(df, aes(x, y, shape = category)) + geom_point()
ggplot(df, aes(x, y, fill = group)) + geom_boxplot()
ggplot(df, aes(x, y, alpha = value) geom_point
Publication Theme
theme_publication <- function(base_size = 12) {
theme_bw(base_size = base_size) +
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_rect(color = 'black', linewidth = 0.5),
axis.text = element_text(color = 'black'),
axis.ticks = element_line(color = 'black'),
legend.key = element_blank(),
strip.background = element_blank(),
strip.text = element_text(face = 'bold')
ggplotdf aesx y
geom_point
theme_publication
Color Palettes
library(RColorBrewer)
library(viridis)
scale_color_brewer(palette = 'Set1')
scale_fill_brewer(palette = 'Set2')
scale_fill_viridis_c()
scale_color_gradient(low = 'white', high = 'red')
scale_fill_gradient2(low = 'blue', mid = 'white', high = 'red', midpoint = 0)
scale_fill_distiller(palette = 'RdBu')
scale_color_manual(values = c('Control' = '#1f77b4', 'Treatment' = '#d62728'))
Volcano Plot
volcano_plot <- function(res, fdr = 0.05, lfc = 1) {
res <- res %>%
mutate(
significance = case_when(
padj < fdr & log2FoldChange > lfc ~ 'Up',
padj < fdr & log2FoldChange < -lfc ~ 'Down',
TRUE ~ 'NS'
)
)
ggplot(res, aes(log2FoldChange, -log10(pvalue), color = significance)) +
geom_point(alpha = 0.6, size = 1) +
scale_color_manual(values
geom_vlinexintercept lfc lfc linetype color
geom_hlineyintercept log10fdr linetype color
labsx y
theme_publication
MA Plot
ma_plot <- function(res, fdr = 0.05) {
res <- res %>%
mutate(significant = padj < fdr)
ggplot(res, aes(log10(baseMean), log2FoldChange, color = significant)) +
geom_point(alpha = 0.5, size = 1) +
scale_color_manual(values = c('TRUE' = 'red', 'FALSE' = 'grey60')) +
geom_hline(yintercept = 0, color = 'black') +
labs(x = y
theme_publication
Boxplot with Points
ggplot(df, aes(group, value, fill = group)) +
geom_boxplot(outlier.shape = NA, alpha = 0.7) +
geom_jitter(width = 0.2, alpha = 0.5, size = 1) +
scale_fill_brewer(palette = 'Set2') +
labs(x = NULL, y = 'Expression') +
theme_publication() +
theme(legend.position = 'none')
Faceting
ggplot(df, aes(x, y)) +
geom_point() +
facet_wrap(~ group, scales = 'free')
ggplot(df, aes(x, y)) +
geom_point() +
facet_grid(rows = vars(condition), cols = vars(timepoint))
Labels and Text
library(ggrepel)
ggplot(res, aes(log2FoldChange, -log10(pvalue))) +
geom_point() +
geom_text_repel(
data = subset(res, padj < 0.01),
aes(label = gene),
max.overlaps = 20,
size = 3
)
Multi-Panel Figures
library(patchwork)
p1 <- ggplot(df, aes(x, y)) + geom_point()
p2 <- ggplot(df, aes(group, value)) + geom_boxplot()
p3 <- ggplot(df, aes(x)) + geom_histogram()
p1 + p2 + p3
(p1 | p2) / p3
(p1 + p2 + p3) + plot_annotation(tag_levels = 'A')
(p1 + p2) + plot_layout(guides =
Saving Figures
ggsave('figure.pdf', p, width = 7, height = 5, units = 'in')
ggsave('figure.png', p, width = 7, height = 5, units = 'in', dpi = 300)
ggsave('figure.tiff', p, width = 7, height = 5, units = 'in', dpi = 300, compression = 'lzw')
ggsave('figure.png', p, width = 10, height = dpi
Axis Formatting
library(scales)
scale_y_continuous(labels = scientific)
scale_x_continuous(labels = comma)
scale_y_log10(labels = trans_format('log10', math_format(10^.x)))
scale_y_continuous(labels = percent)
coord_cartesian(xlim = c(0, 10), ylim = c(0, 100))
scale_x_continuous(breaks = seq(0, 10, 2))
Legend Customization
theme(legend.position = 'bottom')
theme(legend.position = 'none')
theme(legend.position = c(0.8, 0.2))
labs(color = 'Condition', fill = 'Group')
guides(color = guide_legend(title = 'Condition'))
scale_color_discrete(limits = c('Control', 'Treatment'))
Heatmap with pheatmap
library(pheatmap)
library(RColorBrewer)
pheatmap(
mat,
scale = 'row',
color = colorRampPalette(rev(brewer.pal(9, 'RdBu')))(100),
cluster_rows = TRUE,
cluster_cols = TRUE,
show_rownames = TRUE,
show_colnames = TRUE,
annotation_col = annotation_df,
fontsize = 8,
filename = 'heatmap.pdf',
width = 8,
height = 10
)
Related Skills
- differential-expression/de-visualization - DE-specific plots
- pathway-analysis/enrichment-visualization - Enrichment plots
- reporting/rmarkdown-reports - Figures in reports