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
相关产品推荐
相关产品推荐

