为什么stat_density2d函数的bin参数未知? (ggmap)

时间:2015-12-22 07:58:49

标签: r ggplot2 ggmap ggproto

我已经坚持了几个小时。当我运行时:

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

有谁知道为什么?

2 个答案:

答案 0 :(得分: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参数来复制。

enter image description here

答案 1 :(得分:0)

更新

在与Roland进行了长时间的讨论后(见评论),他确定这可能是一个回归错误,并提交了错误报告。

问题是&#34;为什么bins参数未知?&#34;,我花了相当多的时间研究它,我会回答它。

您的示例显然来自2013年10月的此链接,其中使用了参数。 How to correctly interpret ggplot's stat_density2d

然而,它从来都不是一个记录的参数,并且不清楚它是否在那里使用。它可能是一个传递给stat_density2d正在使用的其他库(如MASS)的参数。

我们可以通过删除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)

产生这个: enter image description here

由于这与2013年10月最初链接中发布的情节有很大的不同,我会说stat_density2d从那时起已被广泛改写,或者MASS:kde2d(或另一个MASS例程),以及不再接受bin参数。还不清楚该参数是否做过任何事情(阅读链接)。

然而,你可以改变参数nh - 从stat_density2d观点来看也没有记录(据我所知)。