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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:00:55