R语言ggplot绘图:将坐标轴科学计数法改为10ⁿ格式
要把log坐标轴的刻度从科学计数法(如1e-01)改成10¹、10⁻⁴这类上标格式,你可以通过自定义标签函数或者用scales包的工具实现,以下是两种可行方案:
方案一:无需额外包,自定义标签函数
直接在scale_x_log10和scale_y_log10中传入标签生成函数,将刻度值转换为10^指数的数学表达式:
ggplot() + geom_line(data = data1, aes(f, fsu), color = "green") + geom_line(data = data2, aes(f, fsu), color = "black") + geom_line(data = data.ref, aes(f, fsu), color = "red") + scale_x_log10(limits = c(10^-4, 10), labels = function(x) parse(text = paste0("10^", round(log10(x))))) + scale_y_log10(labels = function(x) parse(text = paste0("10^", round(log10(x))))) + labs(x = "f", y = "fS_u") + theme_minimal()
原理:log10(x)计算出当前刻度对应的指数(因x轴是log10转换),paste0拼接成10^指数的文本,parse()将其解析为ggplot可渲染的数学表达式,最终显示为上标格式。
方案二:使用scales包简化代码
若已安装scales包(ggplot2通常依赖它),可用math_format()快速生成所需标签:
library(scales) ggplot() + geom_line(data = data1, aes(f, fsu), color = "green") + geom_line(data = data2, aes(f, fsu), color = "black") + geom_line(data = data.ref, aes(f, fsu), color = "red") + scale_x_log10(limits = c(10^-4, 10), labels = math_format(expr = 10^.x)) + scale_y_log10(labels = math_format(expr = 10^.x)) + labs(x = "f", y = "fS_u") + theme_minimal()
原理:math_format(expr = 10^.x)会自动将log10尺度下的刻度值(原始值的log10结果)替换到.x位置,生成对应的数学表达式,省去手动计算指数的步骤。
为什么label_scientific()无效?
label_scientific()的作用是生成标准科学计数法格式(如1e-4),而非10的上标形式,因此无法满足需求。
内容的提问来源于stack exchange,提问作者Alessandro Valle
相关产品推荐
相关产品推荐

