You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2的facet_wrap在各id子图中以不同颜色展示x、y、z直方图

Solution: Plot Multiple Variable Histograms per ID Facet

Got it, let's tackle this problem! The core issue here is that your original data is in wide format (with x, y, z as separate columns), but ggplot2 works best with long-format data for grouping variables by color. Here's a straightforward, clean way to get the result you want:

Step 1: Load Required Packages

First, we'll use the tidyverse package—it includes ggplot2 for plotting, plus dplyr and tidyr for data reshaping:

library(tidyverse)

Step 2: Generate (and Prepare) Your Data

I added a set.seed() call so your random data is reproducible. Then we'll reshape the wide data into long format using pivot_longer()—this stacks x, y, z into a single column of values, with another column tracking which variable each value belongs to:

set.seed(123) # Ensures consistent random data
df <- data.frame(id = rep(1:6, each = 50), 
                 x = rnorm(50*6, mean = 10, sd = 5), 
                 y = rnorm(50*6, mean = 20, sd = 10), 
                 z = rnorm(50*6, mean = 30, sd = 15))

# Reshape to long format
df_long <- df %>%
  pivot_longer(cols = c(x, y, z), 
               names_to = "variable", 
               values_to = "value")

Step 3: Plot with ggplot2

Now we can plot all three variables in each facet, using fill to distinguish them. I'll show two common options:

Option 1: Overlapping Histograms (with Transparency)

This lets you see distribution overlap clearly, using alpha to make histograms semi-transparent:

ggplot(df_long, aes(x = value, fill = variable)) +
  geom_histogram(alpha = 0.6, position = "identity", bins = 10) +
  facet_wrap(~id) +
  labs(title = "Overlapping Histograms of x, y, z by ID",
       x = "Value",
       y = "Count",
       fill = "Variable") +
  theme_minimal()

Option 2: Side-by-Side Histograms

If you prefer non-overlapping bars, use position = "dodge" to place histograms next to each other:

ggplot(df_long, aes(x = value, fill = variable)) +
  geom_histogram(position = "dodge", bins = 10, color = "white") +
  facet_wrap(~id) +
  labs(title = "Side-by-Side Histograms of x, y, z by ID",
       x = "Value",
       y = "Count",
       fill = "Variable") +
  theme_minimal()

Why This Works

Reshaping to long format lets us use ggplot2's built-in mapping capabilities—instead of manually adding three separate geom_histogram() layers (one for each variable), we just map the variable column to the fill aesthetic. This is cleaner, easier to maintain, and follows ggplot2's "grammar of graphics" principles.

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:50