Почему неизвестен параметр bins для функции stat_de density2d? (ggmap)

Я застрял в этом несколько часов. Когда я запускаю это:

library(ggmap)
set.seed(1)
n=100

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1))

TestData <- ggplot (data = df) +
  stat_density2d(aes(x = x, y = y,fill = as.factor(..level..)),bins=4, geom = "polygon",) +
  geom_point(aes(x = x, y = y)) +
  scale_fill_manual(values = c("yellow","red","green","royalblue", "black"))

Я получаю это сообщение об ошибке:

Error: Unknown parameters: bins

Кто-нибудь знает почему?


person hans glick    schedule 22.12.2015    source источник
comment
Как вы думаете, почему внутри stat_density2d есть bins аргумент? Это не описано на странице справки.   -  person    schedule 22.12.2015
comment
Это не такой уж и плохой вопрос. OP должен был опубликовать эту ссылку: stackoverflow.com/questions/19329318/, поскольку код был скопирован оттуда.   -  person Mike Wise    schedule 22.12.2015
comment
Очевидно, что параметр bins был удален, вместо него вы можете использовать параметр n, чтобы немного изменить контур, но я не видел, как напрямую контролировать количество сгенерированных уровней. Вероятно, способ есть, но мне нужно его больше исследовать.   -  person Mike Wise    schedule 22.12.2015
comment
Кто-то, кто знает больше об этой функции, несомненно, скоро просветит нас. Прочтите последний пост в приведенной выше ссылке для получения большей информации.   -  person Mike Wise    schedule 22.12.2015
comment
Я не думаю, что у stat_density2d когда-либо был параметр bins. Я проверил версию 0.8.6 (от 2010 года) и ее тогда не было. Версия 2.0.0 более строга в отношении приема неожиданных параметров.   -  person Roland    schedule 22.12.2015
comment
Как таковых, у него не было задокументированного параметра. Но у него был параметр, который был передан в MASS: kde2d. Прочтите ссылку, которую я разместил во втором комментарии выше, для получения дополнительной информации (и примера). Таким же образом вы можете использовать параметры n или h, что не задокументировано. Попытайся.   -  person Mike Wise    schedule 22.12.2015


Ответы (2)


Хорошо, добавлю это в качестве второго ответа, потому что я считаю, что описания и комментарии в первом ответе полезны, и мне не хочется их объединять. В принципе, я решил, что должен быть простой способ восстановить регрессированную функциональность. И через некоторое время, изучив некоторые основы ggplot2, я заставил это работать, переопределив некоторые ggplot2 функции:

library(ggmap)
library(ggplot2)

# -------------------------------
# start copy from stat-density-2d.R

stat_density_2d <- function(mapping = NULL, data = NULL, geom = "density_2d",
                            position = "identity", contour = TRUE,
                            n = 100, h = NULL, na.rm = FALSE,bins=0,
                            show.legend = NA, inherit.aes = TRUE, ...) {
  layer(
    data = data,
    mapping = mapping,
    stat = StatDensity2d,
    geom = geom,
    position = position,
    show.legend = show.legend,
    inherit.aes = inherit.aes,
    params = list(
      na.rm = na.rm,
      contour = contour,
      n = n,
      bins=bins,
      ...
    )
  )
}

stat_density2d <- stat_density_2d

StatDensity2d <- 
  ggproto("StatDensity2d", Stat,
          default_aes = aes(colour = "#3366FF", size = 0.5),

          required_aes = c("x", "y"),

          compute_group = function(data, scales, na.rm = FALSE, h = NULL,
                                   contour = TRUE, n = 100,bins=0) {
            if (is.null(h)) {
              h <- c(MASS::bandwidth.nrd(data$x), MASS::bandwidth.nrd(data$y))
            }

            dens <- MASS::kde2d(
              data$x, data$y, h = h, n = n,
              lims = c(scales$x$dimension(), scales$y$dimension())
            )
            df <- data.frame(expand.grid(x = dens$x, y = dens$y), z = as.vector(dens$z))
            df$group <- data$group[1]

            if (contour) {
              #  StatContour$compute_panel(df, scales,bins=bins,...) # bad dots...
              if (bins>0){
                StatContour$compute_panel(df, scales,bins)
              } else {
                StatContour$compute_panel(df, scales)
              }
            } else {
              names(df) <- c("x", "y", "density", "group")
              df$level <- 1
              df$piece <- 1
              df
            }
          }
  )

# end copy from stat-density-2d.R
# -------------------------------

set.seed(1)
n=100

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1))

TestData <- ggplot (data = df) +
  stat_density2d(aes(x = x, y = y,fill = as.factor(..level..)),bins=5,geom = "polygon") +
  geom_point(aes(x = x, y = y)) +
  scale_fill_manual(values = c("yellow","red","green","royalblue", "black"))
print(TestData)

Что дает результат. Обратите внимание, что изменение параметра bins теперь дает желаемый эффект, который нельзя воспроизвести путем изменения параметра n.

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

person Mike Wise    schedule 29.12.2015
comment
Я только что получил уведомление, что это было исправлено в версии ggplot2 для github, и ошибка была закрыта Хадли. - person Mike Wise; 01.01.2016

Обновить:

После расширенного обсуждения с Роландом (см. Комментарии) он определил, что это, вероятно, ошибка регрессии, и отправил отчет об ошибке.


Поскольку вопрос: «Почему неизвестен параметр bins?», И я потратил немало времени на его изучение, я отвечу на него.

Ваш пример, очевидно, взят из этой ссылки от октября 2013 года, где используется параметр. Как правильно интерпретировать stat_de density2d ggplot

Однако этот параметр никогда не был задокументирован, и неясно, используется ли он там. Вероятно, это параметр, который передается другим библиотекам (например, MASS), которые используются stat_density2d.

Мы можем заставить код работать, избавившись от вызова scale_fill_manual и используя следующее:

library(ggmap)
set.seed(1)
n=100

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1))

TestData <- ggplot (data = df) +
  stat_density2d(aes(x = x, y = y,fill = as.factor(..level..)), geom = "polygon",) +
  geom_point(aes(x = x, y = y)) 
#  scale_fill_manual(values = c("yellow","red","green","royalblue", "black"))
print(TestData)

что дает следующее:  введите описание изображения здесь

Поскольку это выглядит несколько иначе, чем сюжет, опубликованный в исходной ссылке за октябрь 2013 года, я бы сказал, что с тех пор stat_density2d был сильно переписан, или, возможно, MASS:kde2d (или другая процедура MASS), и что параметр bin больше не принимается. Также непонятно, что этот параметр когда-либо делал (читайте ссылку).

Однако вы можете изменять параметры n и h - также недокументированные с точки зрения stat_density2d (насколько я могу судить).

person Mike Wise    schedule 22.12.2015
comment
MASS::kde2d не имеет параметра bins. - person Roland; 23.12.2015
comment
Может, раньше так и было. Очевидно, произошло что-то еще. Вы читали эту публикацию? Там они обсуждают это более подробно. - person Mike Wise; 23.12.2015
comment
Я так не думаю. Смотрите там второй ответ. - person Roland; 23.12.2015
comment
Сообщение от Брайана Хэнсона? Он говорит о bins. Он не понимает, что он делает и как он используется, но явно это был параметр, который функция приняла. Какова ваша позиция? - person Mike Wise; 23.12.2015
comment
Также внимательно посмотрите на первые два графика. Первый имеет bins=4 и 4 цветных сегмента значений. У второго bins=5 и 5 цветных ведер. Так что, по-видимому, именно это сделал bins. И эта функциональность теперь пропала ... И ОП здесь зациклился на этом, потому что это то, что он хотел контролировать. - person Mike Wise; 23.12.2015
comment
Я проверил. У kde2d не было bins параметра даже в 2009 году. У stat_density2d тогда его тоже не было. Вы можете проверить еще раз (старые версии заархивированы на CRAN), но я не думаю, что это когда-либо имело какое-либо влияние. ОП связанных вопросов даже подтверждает это. - person Roland; 23.12.2015
comment
Затем использовалась какая-то другая функция stat_density2d. Чем еще вы объясните появление оригинального поста 2013 года? Мы можем поговорить об этом, если хочешь. Я живу в Германии, поэтому мы, вероятно, находимся в одном часовом поясе. - person Mike Wise; 23.12.2015
comment
Хорошо, я присмотрелся. Параметр bins был фактически передан в stat_contour. Поскольку эллипсы из stat_density больше не передаются в stat_contour, больше невозможно указать количество интервалов. Это похоже на регресс. Я отправлю отчет об ошибке. - person Roland; 23.12.2015
comment
Да, я только что нашел это. Это очень полезная функция. github.com/trinker/embodied/blob/master/inst/ example_plots / - person Mike Wise; 23.12.2015
comment
Я думаю, что Ханс Глик заслуживает одобрения за свои страдания. Я дал ему один, но он получил только 0. - person Mike Wise; 23.12.2015
comment
Извините, но он не получит ни одного от меня, пока не добавит свой sessionInfo() к вопросу. - person Roland; 23.12.2015