复现旧绘图代码失败:遇弃用函数及‘离散值传入连续刻度’报错求助
解决你的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
相关产品推荐
相关产品推荐

