诊断自定义函数产生意外警告的原因(关于position_jitterdodge)

时间:2018-02-16 02:44:11

标签: r ggplot2 dplyr plyr rlang

我正在复制粘贴我正在使用的自定义函数的简化版本。该函数工作正常,但它产生的warnings我无法摆脱。这个函数将成为一个包的一部分,因此对于用户来说,不要被这些神秘错误所抛弃是很重要的,因此,我希望以不再产生这些警告的方式更改脚本。

警告是(见下面完全可重现的例子):

position_jitterdodge requires non-overlapping x intervals

我已经检查过这个关于position_jitterdodgePosition-dodge warning with ggplot boxplot?)的问题,由于此图中没有箱形图,因此没有多大帮助。

对问题和代码的长期性质表示歉意。希望提供所有可能的细节来帮助诊断。

# loading needed libraries
library(ggplot2)
library(dplyr)
library(devtools)
devtools::install_github("daattali/ggExtra")
library(ggExtra) # attach the development version
library(rlang)

# defining the custom function
ggscatterstats <-
  function(data = NULL,
           x,
           y,
           xfill = "orange",
           yfill = "green",
           marginal = NULL,
           marginaltype = "histogram",
           jitter.width = NULL,
           jitter.height = 0.2,
           dodge.width = 0.75) {
    # preparing a dataframe out of provided inputs
    if (!is.null(data)) {
      # if dataframe is provided
      data <-
        dplyr::select(
          .data = data,
          x = !!rlang::enquo(x),
          y = !!rlang::enquo(y)
        )
    } else {
      # if vectors are provided
      data <-
        base::cbind.data.frame(x = x,
                               y = y)
    }

    # preparing the scatterplotplot
    plot <-
      ggplot2::ggplot(data = data,
                      mapping = aes(x = x,
                                    y = y)) +
      geom_count(
        show.legend = FALSE,
        colour = "black",
        size = 3,
        alpha = 0.5,
        position = position_jitterdodge(
          jitter.width = jitter.width,
          jitter.height = jitter.height,
          dodge.width = dodge.width
        )
      ) +
      geom_smooth(method = "lm",
                  se = TRUE,
                  size = 1.5) +
      theme_grey()

    # marginal plot will be shown by default
    if (is.null(marginal))
      marginal <- TRUE

    if (isTRUE(marginal)) {          
      # creating the ggMarginal plot of a given marginaltype
      plot <-
        ggExtra::ggMarginal(
          p = plot,
          type = marginaltype,
          size = 5,
          xparams = list(fill = xfill,
                               col = "black"),
          yparams = list(fill = yfill,
                               col = "black")
        )
    }

    return(plot)

  }

# using the function
ggscatterstats(data = iris, x = Sepal.Length, y = Petal.Width)
#> Warning: position_jitterdodge requires non-overlapping x intervals
#> Warning: position_jitterdodge requires non-overlapping x intervals

reprex package(v0.1.1.9000)创建于2018-02-15。

1 个答案:

答案 0 :(得分:2)

最简单的例子更容易讨论。

这是一个根据代码生成此警告的最小示例:

.jar

我不明白你在这里要做什么。我可能错了,但似乎没有使用不应该一起使用的工具/概念。

library(ggplot2) ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_count(size = 3, alpha = 0.5, position = position_jitterdodge()) 的重点是通过表示给定x y坐标上的观察数与点的大小来处理overplottig。所以你不应该设置尺寸,也不需要抖动/躲避:

geom_count

enter image description here

另一种可能性是使用可以与抖动相结合的ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_count() 但是将抖动与躲避结合在一起似乎没有意义:

geom_point

enter image description here

只有当你有一个离散的x轴和一个额外的躲避者时,抖动+躲闪似乎才有意义。在这里,我们创造了一个人为的附加&#34;性别&#34;变量将被加载到演示的颜色aestetic。

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point(size = 3, alpha = 0.5, position = position_jitter()) 

enter image description here

如果这一切都没有意义,请你解释为什么你需要iris$Sex <- factor(c("M", "F")) ggplot(iris, aes(x = Species, y = Sepal.Width, color = Sex)) + geom_point(size = 3, alpha = 0.5, position = position_jitterdodge()) 具有固定大小(更准确地说是&#34;设置大小&#34;在ggplot术语中)和抖动的组合躲闪?