在R中绘制code_0与code_1两列数据的频数分布同图
解决R中绘制离散数值频数分布的问题
你使用hist()函数不合适,因为该函数是针对连续数据生成直方图的工具,而你需要的是离散数值的频数分布柱状图。以下提供两种可行的实现方法:
方法1:基础R原生实现
先整理两个变量的频数数据,确保取值范围一致后绘制分组柱状图:
# 生成示例数据 snp=c(10139833,10139832,10139834,10139835) code_0=c(7,7,5,4) code_1=c(3,5,5,5) df=data.frame(snp,code_0,code_1) # 计算code_0和code_1的频数表 tab0 <- table(df$code_0) tab1 <- table(df$code_1) # 补全两个表的取值范围,缺失数值的频数设为0 all_values <- union(names(tab0), names(tab1)) tab0_full <- sapply(all_values, function(x) ifelse(x %in% names(tab0), tab0[x], 0)) tab1_full <- sapply(all_values, function(x) ifelse(x %in% names(tab1), tab1[x], 0)) # 合并为矩阵用于绘图 freq_matrix <- rbind(tab0_full, tab1_full) rownames(freq_matrix) <- c("code_0", "code_1") # 绘制并列柱状图 barplot(freq_matrix, beside = TRUE, # 并列显示而非堆叠 col = c("red", "blue"), xlab = "数值", ylab = "频数", main = "code_0与code_1的频数分布") # 添加图例区分两组 legend("topright", legend = rownames(freq_matrix), fill = c("red", "blue"))
方法2:ggplot2包实现(更简洁直观)
借助tidyverse工具链转换数据格式后,快速生成可视化:
# 若未安装包,先运行 install.packages("tidyverse") library(tidyverse) # 生成示例数据 snp=c(10139833,10139832,10139834,10139835) code_0=c(7,7,5,4) code_1=c(3,5,5,5) df=data.frame(snp,code_0,code_1) # 将宽格式数据转为长格式,方便分组绘图 df_long <- df %>% select(-snp) %>% # 剔除不需要的snp列 pivot_longer(cols = everything(), names_to = "分组", values_to = "数值") # 绘制频数分布柱状图 ggplot(df_long, aes(x = factor(数值), fill = 分组)) + geom_bar(position = "dodge", width = 0.7) + # 并列显示两组柱子 scale_fill_manual(values = c("code_0" = "red", "code_1" = "blue")) + labs(x = "数值", y = "频数", title = "code_0与code_1的频数分布") + theme_minimal()
为什么hist函数不适用?
hist()会自动将输入数据视为连续值并划分区间,导致离散数值的频数统计出现错位、重叠的问题,无法准确展示每个离散值的实际出现次数。而barplot或ggplot2::geom_bar()是专门针对离散类别统计频数的工具,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者agnesa rivkin
相关产品推荐
相关产品推荐

