我的目标是能够使用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))
答案 0 :(得分:0)
这是我天真的尝试,因为我几乎不写自定义函数。所以以下可能不是一个好方法。但至少,代码完成了这项工作。我的诀窍是使用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)