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

复现旧绘图代码失败:遇弃用函数及‘离散值传入连续刻度’报错求助

解决你的Subgroup Plot报错与弃用参数问题

我帮你排查了代码里的问题,核心错误和次要的弃用警告都能解决,下面是详细说明和修正后的完整代码:

核心错误:Discrete value supplied to continuous scale

这个报错的根源是你把ID转成了离散的factor作为x轴,但annotation_custom使用的是连续数值的坐标范围,两者尺度不兼容。解决方法是全程把x轴设为连续型的ID,不要转成factor。

次要问题:弃用的ggplot2参数

ggplot2版本更新后,一些旧参数被移除或替换:

  • axis.ticks.margin → 已移除,你这里设为0,直接删除该参数即可
  • panel.margin → 替换为panel.spacing
  • 代码里存在重复的size参数(比如LfLabels的geom_text里写了两次size),需要删除重复项

修正后的完整代码

## REQUIRED PACKAGES
require(grid)
require(ggplot2)
require(plyr)
require(gridExtra)  # 补充加载grid.arrange需要的包

############################################
### CUSTOMIZE APPEARANCE WITH THESE     ####
############################################
blankRows <- 2    # blank rows under boxplot
titleSize <- 4
dataSize <- 4
boxColor <- "pink"
############################################
############################################

## BASIC THEMES (SO TO PLOT BLANK GRID)
theme_grid <- theme(
  axis.line = element_blank(), 
  axis.text.x = element_blank(), 
  axis.text.y = element_blank(),
  axis.ticks = element_blank(), 
  axis.title.x = element_blank(), 
  axis.title.y = element_blank(), 
  axis.ticks.length = unit(0.0001, "mm"),
  legend.position = "none", 
  panel.background = element_rect(fill = "transparent"), 
  panel.border = element_blank(), 
  panel.grid.major = element_line(colour="grey"), 
  panel.grid.minor = element_line(colour="grey"), 
  # 替换panel.margin为panel.spacing
  panel.spacing = unit(c(-0.1,-0.1,-0.1,-0.1), "mm"), 
  plot.margin = unit(c(5,0,5,0.01), "mm")
)

theme_bare <- theme_grid +
  theme(
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank()
  )

## LOAD GROUP DATA AND P values from csv file
groupData

## SYNTHESIZE SOME PLOT DATA - you can load csv instead
## EXPECTS 2 columns - integer for 'ID' matching groupdatacsv
## AND 'HR' Hazard Rate
hazardData <- expand.grid(ID=1:nrow(groupData),HR=1:6)
hazardData$HR <- 1.3-runif(nrow(hazardData))*0.7
hazardData <- rbind(hazardData,ddply(groupData,.(Group),summarize,ID=max(ID)+0.1,HR=NA)[,2:3])
hazardData <- rbind(hazardData,data.frame(ID=c(0,-1:(-2-blankRows),max(groupData$ID)+1,max(groupData$ID)+2),HR=NA))

## Make the min/max mean labels
hrlabels <- ddply(hazardData[!is.na(hazardData$HR),],.(ID),summarize,lab=paste(round(mean(HR),2)," (",round(min(HR),2),"-",round(max(HR),2),")",sep=""))

## Points to plot on the log scale
scaledata <- data.frame(ID=0,HR=c(0.2,0.6,0.8,1.2,1.8))

## Pull out the Groups & P values
group_p <- ddply(groupData,.(Group),summarize,P=mean(P_G),y=max(ID)+0.1)

## identify the rows to be highlighted, and 
## build a function to add the layers
hl_rows <- data.frame(ID=(1:floor(length(unique(hazardData$ID[which(hazardData$ID>0)]))/2))*2,col="lightgrey")
hl_rows$ID <- hl_rows$ID+blankRows+1
hl_rect <- function(col="white",alpha=0.5){
  rectGrob(   x = 0, y = 0, width = 1, height = 1, just = c("left","bottom"), gp=gpar(alpha=alpha, fill=col))
}

## DATA FOR TEXT LABELS
RtLabels <- data.frame(x=c(rep(length(unique(hazardData$ID))-0.2,times=3)),
                     y=c(0.6,6,10),
                     lab=c("Hazard Ratio
(95% CI)","P Value","P Value for
Interaction"))

LfLabels <- data.frame(x=c(rep(length(unique(hazardData$ID))-0.2,times=2)),
                     y=c(0.5,4),
                     lab=c("Subgroup","No. of
Patients"))

LegendLabels <- data.frame(x=c(rep(1,times=2)),
                         y=c(0.5,1.8),
                         lab=c("Off-Pump CABG Better","On-Pump CABG Better"))

## BASIC PLOT - 这里x用连续的ID,不要转成factor
haz <- ggplot(hazardData,aes(x = ID, y = HR))+ labs(x=NULL, y=NULL)

## RIGHT PANEL WITH LOG SCALE
rightPanel <- haz + 
  apply(hl_rows,1,function(x)annotation_custom(hl_rect(x["col"],alpha=0.4),as.numeric(x["ID"])-0.5,as.numeric(x["ID"])+0.5,-20,20)) +
  geom_segment(aes(x = 2, y = 1, xend = 1.5, yend = 1)) + 
  geom_hline(aes(yintercept=1),linetype=2, linewidth=0.5)+
  geom_boxplot(fill=boxColor,size=0.5, alpha=0.8)+ 
  scale_y_log10() + coord_flip() +
  geom_text(data=scaledata,aes(x=3,y=HR,label=HR), vjust=0.5, size=dataSize) +
  geom_text(data=RtLabels,aes(x,y,label=lab, fontface="bold"), vjust=0.5, size=titleSize) +
  geom_text(data=hrlabels,aes(x=ID,y=4,label=lab),vjust=0.5, hjust=1, size=dataSize) +
  geom_text(data=group_p,aes(x=y,y=11,label=P, fontface="bold"),vjust=0.5, hjust=1, size=dataSize) +
  geom_text(data=groupData,aes(x=ID,y=6.5,label=P_S),vjust=0.5, hjust=1, size=dataSize) +
  geom_text(data=LegendLabels,aes(x,y,label=lab, fontface="bold"),hjust=0.5, vjust=1, size=titleSize) +
  geom_point(data=scaledata,aes(x=2.5,y=HR),shape=3,size=3) + 
  geom_point(aes(x=2,y=12),shape=3,alpha=0) + 
  geom_segment(aes(x = 2.5, y = 0, xend = 2.5, yend = 13)) + 
  geom_segment(aes(x = 2, y = 1, xend = 2, yend = 1.8),arrow=arrow(),linetype=1,size=1) + 
  geom_segment(aes(x = 2, y = 1, xend = 2, yend = 0.2),arrow=arrow(),linetype=1,size=1) + 
  theme_bare

## LEFT PANEL WITH NORMAL SCALE
leftPanel <- haz + 
  apply(hl_rows,1,function(x)annotation_custom(hl_rect(x["col"],alpha=0.4),as.numeric(x["ID"])-0.5,as.numeric(x["ID"])+0.5,-20,20)) +
  coord_flip(ylim=c(0,5.5)) +
  geom_point(aes(x=ID,y=1),shape=3,alpha=0) + 
  geom_text(data=group_p,aes(x=y,y=0.5,label=Group, fontface="bold"),vjust=0.5, hjust=0, size=dataSize) +
  geom_text(data=groupData,aes(x=ID,y=1,label=Subgroup),vjust=0.5, hjust=0, size=dataSize) +
  geom_text(data=groupData,aes(x=ID,y=5,label=NoP),vjust=0.5, hjust=1, size=dataSize) +
  # 删除重复的size=4参数
  geom_text(data=LfLabels,aes(x,y,label=lab, fontface="bold"), vjust=0.5, hjust=0, size=titleSize) +
  geom_segment(aes(x = 2.5, y = 0, xend = 2.5, yend = 5.5)) + 
  theme_bare

## PLOT THEM BOTH IN A GRID SO THEY MATCH UP
grid.arrange(leftPanel,rightPanel, widths=c(1,3), ncol=2, nrow=1)

额外提示

如果你的R版本比较新,推荐把plyr的ddply替换成dplyr的group_by()+summarize(),因为plyr已经停止维护了,比如:

# 替换ddply(groupData,.(Group),summarize,P=mean(P_G),y=max(ID)+0.1)
library(dplyr)
group_p <- groupData %>%
  group_by(Group) %>%
  summarize(P=mean(P_G), y=max(ID)+0.1) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:50:23