代码之家  ›  专栏  ›  技术社区  ›  A.Benson

调整ggplot上的比例

  •  0
  • A.Benson  · 技术社区  · 2 月前

    我正在ggplot2中使用geom_boxplot和geom_jitter创建一些方框图。在大多数情况下,我的数据点都集中在方框周围,但也有一些不是。我不会把它们作为异常值删除。渲染绘图时,它会挤压方框,使y轴均匀缩放,并在顶部显示点。我想做的仍然是显示点,但使1和3之间的y轴距离与0和1之间的距离相同(无论如何大致相同)。如果结果更大,我会进行对数或平方根变换,但它们都是小数字。有什么方法可以让我制定这个计划吗?

    这是一些代码

         dat <- data.frame (cat = "A", result = rnorm (87, 0.26, 0.19))
      
      ggplot(dat, aes (x = cat, y = result)) +
        geom_boxplot()+
        geom_jitter()
    

    哪个生产

    example box plot

    现在添加一些更远的数据点

     new_values <- data.frame(cat = "A", result = c(3.4 ,3.2))
      dat <- rbind(dat, new_values)
      ggplot(dat, aes (x = cat, y = result)) +
        geom_boxplot()+
        geom_jitter()
    

    它产生

    the 'problem'

    我想做的是调整y轴的比例,这样方框图就不会被压缩,但它仍然显示了另外两个数据点。像这样的东西。

    approximation of desired result

    欢迎提出任何建议。提前感谢

    1 回复  |  直到 2 月前
        1
  •  2
  •   stefan    2 月前

    一般来说,您可以通过以下方式将任何转换应用于比例 trans= 争论。当您有特定需求并且值得付出努力时,您可以创建自定义转换。但是,作为第一步,您可以考虑使用内置转换之一,例如。 scales::transform_modulus (Box-Cox变换的概括)似乎接近你的想法:

    library(ggplot2)
    library(scales)
    
    set.seed(123)
    
    dat <- data.frame(cat = "A", result = rnorm(87, 0.26, 0.19))
    new_values <- data.frame(cat = "A", result = c(3.4, 3.2))
    dat <- rbind(dat, new_values)
    
    ggplot(dat, aes(x = cat, y = result)) +
      geom_boxplot(outliers = FALSE) +
      geom_jitter() +
      scale_y_continuous(
        trans = scales::transform_modulus(-1),
        breaks = c(0, .5, 1.75, 3.5)
      )