【问题标题】:geom_statdensity2d with specific contours?geom_statdensity2d 具有特定的轮廓?
【发布时间】:2016-07-12 04:30:26
【问题描述】:

我的目标是能够使用geom_density2d() geom 在用户定义的位置的散点图上绘制等高线水平。考虑以下代码:

library(ggplot2)
n = 100
df = data.frame(x = c(rnorm(n, 0, .5), rnorm(n, 3, .5)),
                y = c(rnorm(n, 1, .5), rnorm(n, 0, .5)))

ggplot(df, aes(x = x, y = y)) +
   geom_density2d() +
   geom_point() 

这会生成一个标准的等高线图,但似乎没有办法手动控制绘制哪些等高线。可选参数 bins 和 h in 可以在一定程度上控制等高线(我假设是从 MASS 传递给 kde2d),但结果线似乎无法解释。

理想情况下,我可以从 ks 库中复制 plot.kde 的功能,这些功能可以通过 cont 参数进行控制。

library(ks)
est = kde(df)
plot(est, cont = c(50, 95))

【问题讨论】:

标签: r ggplot2


【解决方案1】:

这是我天真的尝试,因为我几乎不编写自定义函数。因此,以下可能不是一个好方法。至少,代码完成了这项工作。我的诀窍是使用 ggplot 创建的数据集。首先,您绘制一个图形并获取用于图形的数据,您可以从ggplot_build(g)$data[1] 找到。在此,您可以找到名为level 的列。使用该列,您可以对每条等高线的数据进行子集化。在myfun() 中,您需要指定您想要的级别。该函数对具有指定级别的数据进行子集化并绘制图形。

setseed(111)
mydf = data.frame(x = c(rnorm(100, 0, .5), rnorm(100, 3, .5)),
                  y = c(rnorm(100, 1, .5), rnorm(100, 0, .5)))

g <- ggplot(mydf, aes(x = x, y = y)) +
            geom_density2d() +
            geom_point()

### Get a list containing data used for drawing g.

temp <- as.data.frame(ggplot_build(g)$data[1])

### Check which levels you have in g

ind <- unique(temp$level)

ind
#[1] 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20


myfun <- function(...){
               ana <- c(...)
               foo <- subset(temp, level %in% ana)

               g <- ggplot() +
               geom_path(data = foo, aes(x = x, y = y, group = group), colour = "red")

               print(g)

               }

### Run myfun by specify levels you want.
myfun(0.02, 0.10, 0.18)

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2021-10-21
    • 2017-06-05
    • 1970-01-01
    • 2019-01-25
    • 2014-09-12
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多