You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在ggplot的facet_wrap分组中按分面拆分图例

Grouping Legends by Facet Groups in ggplot2

Absolutely! You can achieve organized, grouped legends tied to your facet groups (A, B, C) with a clean, structured layout using the ggh4x package—it’s the most straightforward solution for this use case. Here’s a step-by-step implementation:

Step 1: Load Required Packages

First, install and load the tools we’ll need for plotting, data manipulation, and grouped legends:

install.packages(c("ggplot2", "dplyr", "ggh4x"))
library(ggplot2)
library(dplyr)
library(ggh4x)

Step 2: Prepare Your Data

We’ll use your exact data preparation code to keep consistency with your reprex:

mtcars$names <- rownames(mtcars)
mtcars <- mtcars %>% mutate(group = case_when(gear == 3 ~ "A", gear == 4 ~ "B", gear == 5 ~ "C"))

Step 3: Create the Plot with Grouped Legends

The core of this solution is guide_grouped_legend() from ggh4x, which lets us cluster legend items by your facet groups. First, we’ll sort our legend items to ensure they’re grouped correctly:

# Create a sorted lookup table to pair car names with their facet groups
name_group_lookup <- mtcars %>% 
  select(names, group) %>% 
  distinct() %>% 
  arrange(group)

# Build the final plot
ggplot(data = mtcars, aes(mpg, disp, color = names)) +
  geom_line(size = 1, aes(group = group)) +
  geom_point() +
  scale_color_discrete(
    # Order legend items to match facet group clusters
    breaks = name_group_lookup$names,
    # Configure grouped legend with facet group titles
    guide = guide_grouped_legend(
      group = name_group_lookup$group,
      group_name_position = "top",
      ncol = 1,
      title = "Car Names (Grouped by Facet)"
    )
  ) +
  facet_wrap(~ group)

How It Works

  • name_group_lookup ensures legend items are sorted by their facet group, so all Group A cars appear first, followed by Group B, then Group C.
  • guide_grouped_legend() uses the group parameter to assign each legend item to its corresponding facet group, with group_name_position = "top" placing the group title above each cluster of items.
  • ncol = 1 maintains your original single-column legend layout.

If you’d rather avoid external packages, you could manually adjust the legend using gtable, but this requires far more complex code and is less maintainable than the ggh4x approach.

内容的提问来源于stack exchange,提问作者InesGuardans

火山引擎 最新活动