如何使用ggplot为单值dataframe的每列基因绘制同图箱线图
R基于ggplot绘制多基因箱线图的优雅实现
ggplot的语法设计原生适配长表结构,宽表转长表是最标准的实现路径,配合管道操作可以做到全程无冗余中间变量,代码非常简洁。
1. 示例数据构造(可直接替换为你的实际数据)
# 匹配你给出的DataFrame结构:行名为样本名,列名为基因名 df <- data.frame( row.names = c("S1", "S2", "S3", "S4"), G1 = c(0.19021657, 0.431098317, 0.433107132, 0.800781053), G2 = c(0.129541639, 0.791633452, 0.085196075, 0.221191986), G3 = c(0.741696359, 0.502163442, 0.071400934, 0.918588422) )
2. 管道流绘图代码(无冗余中间变量)
无需单独存储转换后的长表,直接通过管道传递数据:
library(tidyverse) df %>% rownames_to_column("sample_id") %>% # 把行名的样本id转为单独一列 pivot_longer(cols = -sample_id, names_to = "gene", values_to = "expression") %>% # 宽表转长表 ggplot(aes(x = gene, y = expression)) + geom_boxplot(fill = "#8ecae6", alpha = 0.7) + # 可自定义填充色、透明度 labs(x = "基因名称", y = "表达量") + theme_classic() # 可替换为你偏好的主题
3. 轻量替代方案(仅加载ggplot2+reshape2)
如果不想加载整个tidyverse,也可以用reshape2的melt函数转长表:
library(ggplot2) library(reshape2) # 直接melt转换,自动识别行名作为样本标识 df_melt <- melt(df, variable.name = "gene", value.name = "expression") ggplot(df_melt, aes(x = gene, y = expression)) + geom_boxplot()
如果之前重塑后绘图未得到预期结果,大概率是转长表时未正确映射基因/表达量字段,上述代码已适配你给出的DataFrame结构,直接代入你的实际数据即可运行。
内容的提问来源于stack exchange,提问作者biobudhan
相关产品推荐
相关产品推荐

