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

R语言多变量归一化后小提琴图绘制异常问题咨询

问题核心原因
  • 列索引硬编码错误:原归一化代码选取化合物列时写死范围为DF1[2:12],但示例数据集共包含12个化合物列(从第2列到第13列),漏选了最后1列化合物,导致数据结构错位、数值映射异常。
  • 废弃函数兼容性问题:使用已从tidyr包退役的gather()函数做长宽表转换,当化合物列数超过30时,容易出现列类型识别错误,把数值型的检测结果转为字符型,无法计算核密度生成小提琴图。
  • 渲染尺寸适配失败:化合物数量较多时,默认绘图尺寸下x轴化合物名会完全重叠,触发ggplot2的渲染保护机制,直接输出空白画布,不是代码逻辑错误。
  • 补充说明:小提琴图的核心是核密度估计,当每个化合物对应的样本量少于20时,生成的分布形状会有明显畸变,属于统计方法本身的特性,不是代码bug。
修正后可运行代码

代码自动适配任意数量化合物、任意样本量的场景,无需手动修改列索引:

library(tidyverse)

# ----------------------
# 1. 数据集构建(替换为你的真实数据即可)
# ----------------------
set.seed(123) # 仅用于示例数据复现,真实数据无需这行
sample_num <- 12
compound_num <- 35 # 可修改为任意化合物数量,测试30+的大规模场景
DF1 <- data.frame(
  Sample.Name = paste0(rep(c("A", "B"), each = 6), 1:6, "_VAR_B")
)
# 批量生成化合物列
for(i in 1:compound_num){
  DF1[[paste0("Compound", i)]] <- runif(sample_num, 0, 100)
}

# ----------------------
# 2. 最小-最大归一化(可替换为其他归一化函数)
# ----------------------
Normalization_MM <- function(x) {
  (x - min(x, na.rm = T)) / (max(x, na.rm = T) - min(x, na.rm = T))
}
# 自动识别所有化合物列,避免硬编码漏列
Data_normalized_TEST <- as.data.frame(lapply(DF1[2:ncol(DF1)], Normalization_MM))
Data_normalized_TEST$Sample.Name <- DF1$Sample.Name
Data_normalized_TEST <- Data_normalized_TEST %>%
  relocate(Sample.Name, .before = 1) # 自动将样本名列放到第一列

# ----------------------
# 3. 稳定版长宽表转换
# ----------------------
plot_data <- Data_normalized_TEST %>%
  pivot_longer(
    cols = -Sample.Name,
    names_to = "Metabolites",
    values_to = "Values"
  )

# ----------------------
# 4. 基础小提琴图绘制
# ----------------------
TESTT2 <- ggplot(plot_data, aes(x = Metabolites, y = Values)) +
  geom_violin(adjust = .5, fill = "steelblue", alpha = 0.7) +
  # 旋转x轴标签避免重叠
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1, size = 7)) +
  scale_y_continuous(limits = c(0, 1), name = "归一化后数值") +
  scale_x_discrete(name = "检测化合物")
大规模数据集(30+化合物)绘图优化
  • 解决空白渲染问题:不要直接在RStudio的默认小绘图面板输出结果,二选一即可:
    1. 手动拖大RStudio右侧Plots面板的宽度,再运行绘图代码
    2. 直接用ggsave()将图片输出到本地文件,指定足够的画布宽度,30个以上化合物建议设置宽度为12-18英寸,参考代码:
ggsave("多化合物归一化分布小提琴图.png", plot = TESTT2, width = 16, height = 6, dpi = 300)
  • 保留样本标注信息:在小提琴图层上叠加抖动散点,将样本名映射为颜色属性即可同时保留样本分组信息,参考代码:
TESTT2 <- TESTT2 +
  geom_jitter(aes(color = Sample.Name), size = 1, alpha = 0.6) +
  # 图例分2列展示,避免过长遮挡图像
  guides(color = guide_legend(ncol = 2))
  • 多归一化方法对比:后续测试Z-score、中位数归一化、总量归一化等其他方法时,仅需替换归一化函数的内部计算逻辑,后续长宽转换、绘图的代码无需修改,可直接复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:42:06