ggplot2多图绘制:同一数据按不同因子着色,gridExtra与cowplot对比
Great question! Let's break this down step by step—first how to create those side-by-side cluster plots with shared data, then the key differences between gridExtra and cowplot for this task.
Step 1: Generate Shared Data & Individual Cluster Plots
First, let's use a concrete example with ggplot2 (the go-to tool for this kind of visualization). We’ll take a dataset, add cluster assignments from different algorithms, then create a reusable function to generate plots.
Sample Data Preparation
We’ll use the classic Iris dataset and add results from K-Means, Hierarchical, and DBSCAN clustering:
library(ggplot2) library(dplyr) library(dbscan) set.seed(123) # For reproducibility cluster_data <- iris %>% mutate( kmeans = as.factor(kmeans(select(., -Species), centers = 3)$cluster), hierarchical = as.factor(cutree(hclust(dist(select(., -Species))), k = 3)), dbscan = as.factor(dbscan(select(., -Species), eps = 0.5, minPts = 5)$cluster) )
Reusable Plot Function
Create a function to generate a plot for any cluster column—this avoids repeating code and ensures consistency:
make_cluster_plot <- function(data, cluster_col, plot_title) { ggplot(data, aes(x = Sepal.Length, y = Sepal.Width, color = .data[[cluster_col]])) + geom_point(size = 2) + labs(title = plot_title, color = "Cluster ID") + theme_minimal() } # Generate individual plots cluster_plots <- list( make_cluster_plot(cluster_data, "kmeans", "K-Means Clustering"), make_cluster_plot(cluster_data, "hierarchical", "Hierarchical Clustering"), make_cluster_plot(cluster_data, "dbscan", "DBSCAN Clustering") )
Step 2: Arranging Plots with gridExtra vs cowplot
Now let’s cover how to combine these plots, then break down the key differences between the two packages.
Using gridExtra
gridExtra is built on R’s core grid system, making it flexible for mixing plot types:
library(gridExtra) grid.arrange(grobs = cluster_plots, ncol = 3, top = "Cluster Result Comparison")
Using cowplot
cowplot is optimized for ggplot2, with built-in alignment and styling helpers:
library(cowplot) plot_grid( plotlist = cluster_plots, ncol = 3, labels = c("A", "B", "C"), label_size = 12, title = "Cluster Result Comparison" )
Key Differences Between gridExtra and cowplot
Let’s break down the critical distinctions that matter for your clustering visualization task:
Underlying Focus
gridExtrais a general-purpose grid layout tool—it works with ggplot2, lattice, and even base R plots. It’s great if you need to mix plot systems in one layout.cowplotis purpose-built for ggplot2. All its features are tailored to streamline workflows with ggplot, so it feels more intuitive if you’re only working with ggplot plots.
Alignment & Consistency
gridExtrarequires manual adjustment (via thealignparameter orarrangeGrob()) to get perfectly aligned axes between plots. If your plots have different scales or labels, alignment can be finicky.cowplot::plot_grid()automatically aligns plot panels or axes by default. This is a huge plus for side-by-side cluster comparisons, where consistent axes make it easier to spot differences.
Theme Handling
gridExtraleaves your plot themes untouched—your plots retain whatever styling you set (e.g., ggplot’s default theme,theme_minimal()).cowplotapplies its own clean, minimal default theme to plots unless you specifytheme = NULL. This is handy if you want all your comparison plots to have a unified look without manually setting themes for each one.
Extra Features
gridExtraincludestableGrob()to add summary tables (like cluster metrics) directly to your layout, which is useful for pairing visualizations with quantitative data.cowplothas ggplot-specific helpers:get_legend()lets you extract a legend from one plot and reuse it across all (great for saving space),draw_plot_label()adds custom annotations, andrel_widths/rel_heightsmake it easy to adjust plot sizes in complex layouts.
Ease of Use
- For ggplot-only workflows,
cowplotis more straightforward. Tasks like adding labels, aligning plots, and adjusting sizes require less code. gridExtrais more verbose for ggplot-specific tasks but offers greater flexibility for mixed-plot scenarios.
- For ggplot-only workflows,
Final Recommendation
If your entire pipeline uses ggplot2 and you prioritize easy alignment, unified styling, and ggplot-specific tools, go with cowplot. If you need to mix plot types (e.g., a base R histogram alongside your ggplot cluster plots) or work with low-level grid objects, gridExtra is the better choice.
内容的提问来源于stack exchange,提问作者A Duv




