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

使用ggplot的scale_x_reverse翻转ROC图X轴后灵敏度骤降求助

ROC曲线绘制中scale_x_reverse导致曲线异常的问题解决

问题描述

在使用ggplot绘制ROC曲线时,为了设置特异性从100到0的坐标轴逻辑,启用scale_x_reverse()后曲线出现灵敏度骤降的异常形态;未启用该函数时,曲线为正常的ROC形态。

未翻转X轴时的代码:

# ROC-curve with inverted specificity axis
roc_plot <- ggplot( data = data_plot, aes( x = spec, y = sens ) ) +
  geom_area( fill = "#02a2ad", alpha = 0.06 ) +
  geom_line( linewidth = 0.8, colour = "#02a2ad" ) +
  geom_segment( aes( x = 100, xend = 0, y = 0, yend = 100 ), linewidth = 1, linetype = 3, colour = "#939899" ) +
  xlab( "Specificity (%)" ) +               
  ylab( "Sensitivity (%)" ) +
  scale_y_continuous( breaks = number_ticks( 8 ) ) +
  #scale_x_reverse( breaks = number_ticks( 8 ) ) +
  coord_flip()+
  theme_classic() +
  annotate( "text", label = paste0( "AUC = ", round( roc$auc[ 1 ], 3 ) ),
            x = 20, y = 11, size = 4, fontface = "bold", colour = "#02a2ad" )

未启用scale_x_reverse()时,曲线为标准ROC形态,从左下到右上平滑上升,参考对角线正常;启用该函数后,曲线形态扭曲,出现明显的灵敏度骤降异常。

原因分析

问题根源是**scale_x_reverse()与coord_flip()的执行顺序冲突**。ggplot的图层渲染遵循固定流程:先执行scale_*系列的坐标轴数值变换,再执行coord_flip()的轴交换操作。

你的代码中,x=spec、y=sens,启用scale_x_reverse()后先反转了X轴的数值顺序,随后coord_flip()将反转后的X轴与Y轴交换,导致曲线的坐标映射逻辑完全混乱,最终呈现异常形态。

解决方案

提供两种可靠的修复方式:

方法1:适配轴翻转逻辑调整反转对象

由于coord_flip()已将原始X轴(spec)转换为图表的Y轴方向,需先反转原始X轴,再执行轴交换,确保最终坐标轴逻辑正确:

# ROC-curve with inverted specificity axis
roc_plot <- ggplot( data = data_plot, aes( x = spec, y = sens ) ) +
  geom_area( fill = "#02a2ad", alpha = 0.06 ) +
  geom_line( linewidth = 0.8, colour = "#02a2ad" ) +
  geom_segment( aes( x = 100, xend = 0, y = 0, yend = 100 ), linewidth = 1, linetype = 3, colour = "#939899" ) +
  xlab( "Specificity (%)" ) +               
  ylab( "Sensitivity (%)" ) +
  scale_y_continuous( breaks = number_ticks( 8 ) ) +
  scale_x_reverse( breaks = number_ticks( 8 ) ) +  # 先反转原始X轴(spec)
  coord_flip() +  # 再交换XY轴
  theme_classic() +
  annotate( "text", label = paste0( "AUC = ", round( roc$auc[ 1 ], 3 ) ),
            x = 20, y = 11, size = 4, fontface = "bold", colour = "#02a2ad" )

方法2:改用标准假阳性率作为X轴(避免轴变换冲突)

标准ROC曲线的X轴通常使用假阳性率(100 - Specificity),直接基于该指标绘制可完全避免轴反转与翻转的冲突,逻辑更清晰:

# 计算假阳性率
data_plot$fp_rate <- 100 - data_plot$spec

# 绘制标准ROC曲线
roc_plot <- ggplot( data = data_plot, aes( x = fp_rate, y = sens ) ) +
  geom_area( fill = "#02a2ad", alpha = 0.06 ) +
  geom_line( linewidth = 0.8, colour = "#02a2ad" ) +
  geom_segment( aes( x = 0, xend = 100, y = 0, yend = 100 ), linewidth = 1, linetype = 3, colour = "#939899" ) +
  xlab( "False Positive Rate (%)" ) +               
  ylab( "Sensitivity (%)" ) +
  scale_x_continuous( breaks = number_ticks( 8 ) ) +
  scale_y_continuous( breaks = number_ticks( 8 ) ) +
  theme_classic() +
  annotate( "text", label = paste0( "AUC = ", round( roc$auc[ 1 ], 3 ) ),
            x = 80, y = 11, size = 4, fontface = "bold", colour = "#02a2ad" )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:24:56