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

如何在R中绘制含正负零值的双对称对数尺度宽范围数据?

在R中绘制含正、负、0值的双对称对数尺度图表

自定义双对称对数变换实现

基于双对称对数变换的数学逻辑,我们可以直接在R中自定义适配ggplot的变换函数,解决ggallin::pseudolog10_trans无法处理的正负值+0值场景:

# 构建双对称对数变换(支持自定义底数)
bisymmetric_log_trans <- function(base = 10) {
  # 变换函数:正数值取对数,负数值取绝对值对数后加负号,0值保持0
  trans_func <- function(x) {
    ifelse(x > 0, log(x, base), 
           ifelse(x < 0, -log(-x, base), 0))
  }
  # 逆变换函数:还原原始数值
  inv_func <- function(x) {
    ifelse(x > 0, base^x, 
           ifelse(x < 0, -base^(-x), 0))
  }
  # 注册为ggplot可用的变换类型
  scales::trans_new(paste0("bisymmetric_log_", base),
                    transform = trans_func,
                    inverse = inv_func,
                    domain = c(-Inf, Inf))
}

示例绘图验证

用包含正、负、0值的模拟数据测试效果:

library(ggplot2)

# 生成测试数据
set.seed(123)
test_data <- data.frame(
  x = seq(-100, 100, by = 1),
  y = c(rnorm(100, -50, 10), 0, rnorm(100, 50, 10))
)

# 绘制双对称对数尺度图表
ggplot(test_data, aes(x, y)) +
  geom_point(size = 1.2, alpha = 0.6) +
  scale_y_continuous(
    trans = bisymmetric_log_trans(base = 10),
    # 自定义坐标轴刻度,匹配原始数据量级
    breaks = c(-100, -10, -1, 0, 1, 10, 100),
    labels = c("-100", "-10", "-1", "0", "1", "10", "100")
  ) +
  labs(title = "双对称对数尺度示例", y = "双对称对数变换值") +
  theme_minimal()

关键说明

  • 该变换完整保留0值,对正负值做对称的对数压缩,完全匹配双对称对数尺度的需求
  • 可通过修改base参数切换对数底数(如自然对数用base = exp(1))
  • 自定义刻度breaks和labels能让坐标轴更直观反映原始数据的量级

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:14:55