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

使用ggplot在单张直方图绘制多变量频率分布(无需转长格式)

无需转换为长格式绘制多变量频率分布的方法

可以不用将数据集转换为长格式来绘制三个变量的频率分布,以下是两种在R中实现的方法:

方法1:Base R 绘制分组柱状图

先分别计算每个变量的频数分布,统一取值范围后绘制分组柱状图:

# 加载数据集
df <- structure(list(v1 = c(0, 0, 2, 1, 0, 0, 4, 0, 0, 1), v2 = c(0, 
0, 2, 0, 3, 0, 0, 3, 0, 1), v3 = c(1, 0, 0, 0, 0, 3, 0, 
0, 0, 0)), row.names = c(NA, 10L), class = "data.frame")

# 计算各变量的频数表
freq_v1 <- table(df$v1)
freq_v2 <- table(df$v2)
freq_v3 <- table(df$v3)

# 获取所有变量的唯一取值,统一x轴范围
all_values <- sort(unique(c(as.numeric(names(freq_v1)), as.numeric(names(freq_v2)), as.numeric(names(freq_v3)))))

# 补全每个变量在所有取值上的频数(缺失值填0)
freq_v1_full <- sapply(all_values, function(x) ifelse(x %in% names(freq_v1), freq_v1[as.character(x)], 0))
freq_v2_full <- sapply(all_values, function(x) ifelse(x %in% names(freq_v2), freq_v2[as.character(x)], 0))
freq_v3_full <- sapply(all_values, function(x) ifelse(x %in% names(freq_v3), freq_v3[as.character(x)], 0))

# 绘制分组柱状图
barplot(rbind(freq_v1_full, freq_v2_full, freq_v3_full), 
        beside = TRUE, 
        names.arg = all_values,
        col = c("#E63946", "#457B9D", "#1D3557"),
        xlab = "数值",
        ylab = "频数",
        main = "v1/v2/v3 频率分布")
legend("topright", legend = c("v1", "v2", "v3"), fill = c("#E63946", "#457B9D", "#1D3557"))

方法2:ggplot2 叠加图层绘制

直接为每个变量添加独立的geom_bar图层,实现同图展示:

library(ggplot2)

ggplot() +
  # 绘制v1的频率
  geom_bar(aes(x = factor(v1), fill = "v1"), data = df, position = "dodge", alpha = 0.8) +
  # 绘制v2的频率
  geom_bar(aes(x = factor(v2), fill = "v2"), data = df, position = "dodge", alpha = 0.8) +
  # 绘制v3的频率
  geom_bar(aes(x = factor(v3), fill = "v3"), data = df, position = "dodge", alpha = 0.8) +
  # 自定义颜色
  scale_fill_manual(values = c("v1" = "#E63946", "v2" = "#457B9D", "v3" = "#1D3557")) +
  # 标签设置
  labs(x = "数值", y = "频数", title = "v1/v2/v3 频率分布", fill = "变量") +
  theme_minimal()

补充说明

虽然上述方法无需转换长格式,但转换为长格式是ggplot2更推荐的简洁写法,对比参考:

library(tidyr)
# 转换为长格式
df_long <- pivot_longer(df, cols = everything(), names_to = "variable", values_to = "value")

ggplot(df_long, aes(x = factor(value), fill = variable)) +
  geom_bar(position = "dodge", alpha = 0.8) +
  scale_fill_manual(values = c("v1" = "#E63946", "v2" = "#457B9D", "v3" = "#1D3557")) +
  labs(x = "数值", y = "频数", title = "v1/v2/v3 频率分布", fill = "变量") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:35:24