使用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
相关产品推荐
相关产品推荐

