диагностика того, почему пользовательская функция выдает неожиданное предупреждение (о position_jitterdodge)

Я копирую упрощенную версию пользовательской функции, с которой работаю. Функция работает нормально, но это warnings, от которого я не смог избавиться. Эта функция будет частью пакета, и поэтому важно, чтобы пользователи не были сбиты с толку этими загадочными ошибками, и поэтому я хотел бы изменить сценарий таким образом, чтобы эти предупреждения больше не производились.

Предупреждение (см. полностью воспроизводимый пример ниже):

position_jitterdodge requires non-overlapping x intervals

Я уже проверил этот вопрос о position_jitterdodge (предупреждение о позиции-уклонении с 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

Создано 15 февраля 2018 г. с помощью пакета reprex (v0.1.1.9000).


person Indrajeet Patil    schedule 16.02.2018    source источник


Ответы (1)


Минимальный пример легче обсуждать.

Это минимальный пример, адаптированный из вашего кода, который выдает это предупреждение:

library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_count(size = 3, alpha = 0.5, position = position_jitterdodge())

Я не понимаю, что вы пытаетесь здесь сделать. Я могу ошибаться, но, похоже, есть инструменты/концепции, которые не следует использовать вместе.

Весь смысл geom_count состоит в том, чтобы иметь дело с чрезмерным графиком, представляя количество наблюдений на заданной паре координат x y с размером точки. Таким образом, вы не должны устанавливать размер, а дрожание/уклонение также не нужно:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_count() 

введите здесь описание изображения

Другая возможность состоит в том, чтобы использовать geom_point, который вы можете комбинировать с дрожанием, но сочетание дрожания с уклонением здесь также не имеет смысла:

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

введите здесь описание изображения

Дрожание + уклонение, кажется, имеет смысл только тогда, когда у вас есть дискретная ось x и дополнительная эстетика, от которой можно уклониться. Здесь мы создаем искусственную дополнительную переменную «пол», которая будет сопоставлена ​​с цветовой эстетикой для демонстрации.

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()) 

введите здесь описание изображения

Если все это не имеет смысла, не могли бы вы объяснить, почему вам нужен geom_count с фиксированным размером (точнее, «установленный размер» в жаргоне ggplot) и комбинацией дрожания и уклонения?

person Gilles    schedule 18.02.2018
comment
предупреждение происходит в ggplot2:::collide, где определены интервалы (на вашем последнем графике здесь эти интервалы представляют собой пространство между красными точками и соответствующими зелеными точками). Мы можем воспроизвести предупреждения OP, запустив ggplot(iris, aes(x = Species, y = Sepal.Width, color = Sex)) + geom_point(size = 3, alpha = 0.5, position = position_jitterdodge(dodge.width = 3)) - person Moody_Mudskipper; 18.02.2018
comment
OP может удалить эти предупреждения, запустив ggscatterstats(data = iris, x = Sepal.Length, y = Petal.Width,dodge.width = 0.1), но, как указано в вашем ответе, лучше сначала убедиться, что текущий подход имеет смысл. - person Moody_Mudskipper; 18.02.2018