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

R语言ggplot添加annotation_logticks()对数刻度报错PANEL行数不匹配如何解决

问题原因

  • 拼写错误:你后续补充的代码里误将annotation_logticks()写成了annotation_lockticks(),属于低级笔误
  • 核心报错原因:ggplot美学映射中直接使用data_long$列名的全局引用方式,和annotation_logticks()的分面匹配逻辑冲突:annotation_logticks()会按分面面板生成对应刻度,全局引用数据集列会导致行匹配逻辑混乱,触发行数不匹配的报错
  • 额外不规范点:scale_fill_manual中指定的分组名和数据集里variable的因子级别不一致(数据集里组合抗体名用三个点分隔,你代码里用加号),会导致颜色映射失效

解决方法

先加载依赖包,再修正映射写法,完整可运行代码如下:

library(ggplot2)
library(scales)

# 赋值你提供的数据集
data_long <- structure(list(Variant = c("B.1.351", "B.1.429", "B.1.427", "B.1.1.7", 
"B.1.617.2", "B.1.617.1", "B.1.617", "P.1", "B.1.351", "B.1.429", 
"B.1.427", "B.1.1.7", "B.1.617.2", "B.1.617.1", "B.1.617", "P.1", 
"B.1.351", "B.1.429", "B.1.1.7", "B.1.617.2", "B.1.617.1", "B.1.617", 
"P.1", "B.1.351", "B.1.429", "B.1.427", "B.1.1.7", "B.1.617.2", 
"B.1.617.1", "B.1.617", "P.1", "B.1.351", "P.1", "B.1.617.2", 
"B.1.351", "B.1.617", "B.1.351", "B.1.429", "B.1.1.7", "B.1.617.1", 
"B.1.617"), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 6L, 7L, 7L, 8L, 8L, 8L, 
8L, 8L), .Label = c("Casirivimab", "Imdevimab", "Bamlanivimab", 
"Etesevimab", "Sotrovimab", "Regdanvimab", "Etesevimab...Bamlanivimab", 
"Casirivimab...Imdevimab"), class = "factor"), value = c(862.1, 
0.9, 1, 1.4, 1, 17.6, 3.6, 69.6, 1, 5, 0.7, 1.1, 4.2, 3.8, 1, 
0.6, 169209.3, 2000, 1.7, 4175.6, 1700, 450, 1814.5, 11140.6, 
0.9, 2.1, 5.5, 0.5, 1.2, 0.9, 11915, 0.5, 0.7, 13, 300, 4.7, 
1.3, 0.8, 0.6, 0.8, 1), N = c(8L, 2L, 1L, 6L, 4L, 3L, 1L, 4L, 
8L, 2L, 1L, 6L, 3L, 3L, 1L, 4L, 6L, 1L, 5L, 3L, 2L, 1L, 3L, 5L, 
1L, 1L, 3L, 3L, 2L, 1L, 5L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 
1L)), row.names = c(NA, -41L), class = "data.frame")

# 把组合抗体的名称替换为你需要的加号格式,匹配颜色映射的命名
levels(data_long$variable) <- gsub("\\.\\.\\.", " + ", levels(data_long$variable))

# 绘图,aes内不使用全局引用,直接传入列名即可
plot <- ggplot(data_long, aes(fill= variable, y= value, x= variable)) + 
  geom_bar(position="dodge", stat="identity") +
  scale_fill_manual("legend", values = c("Casirivimab" = "brown2", "Imdevimab" = "darkorchid1", "Bamlanivimab" = "mediumblue","Etesevimab" = "deeppink", "Sotrovimab" = "cyan3", "Regdanvimab" = "yellow2", "Etesevimab + Bamlanivimab" = "magenta3", "Casirivimab + Imdevimab" = "chartreuse4" )) +
  scale_y_continuous(trans='log10', breaks = trans_breaks("log10", function(x) 10^x),
                     labels = trans_format("log10", math_format(10^.x))) +
  # 正确拼写对数刻度函数
  annotation_logticks() +
  # 分面直接引用列名,不使用全局数据集调用
  facet_wrap(~factor(Variant, levels = c("B.1.351", "P.1", "B.1.617", "B.1.617.1", "B.1.617.2", "B.1.1.7", "B.1.427", "B.1.429", "B.1.525")), ncol = 9) +
  labs (x = "", y = "Fold Change Neutralisation", fill = "mAb") +
  theme(
    aspect.ratio=6/2,
    axis.text.x = element_blank(), 
    axis.ticks.x = element_blank(), # 仅关闭x轴刻度,保留y轴对数刻度
    legend.key.size = unit(0.2, 'cm'),
    panel.grid = element_blank()
  ) +
  geom_text(aes(label = N), nudge_x = 0.5, nudge_y = 0.25, color="black",vjust = 0.5,hjust = 1.2)

plot

优化说明

原来的代码重复设置了两次aspect.ratio,后面的配置会覆盖前面的,合并到同一个theme配置项更简洁;原来的axis.ticks = element_blank()会把新增的y轴对数刻度也清除,调整为仅关闭x轴刻度即可。

内容的提问来源于stack exchange,提问作者M.J. Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:15:04