這是一個擴展x和y範圍以包括密度等高線的最大範圍的函數。該功能的工作原理如下:
創建擴展遠遠超出了數據範圍x和y的範圍情節的對象,讓我們可以肯定的情節將包括完整的輪廓線。
使用ggplot_build
來確定所有密度等值線中的最小和最大x和y值。
設置X和情節在步驟2確定
exp
的參數的最小值和最大值x和y值的y的範圍是有擴大通過一個微小的量的最終範圍(默認情況下爲1%),因爲一小段輪廓線仍然可以在沒有少量額外填充的情況下被切斷(在下面的示例中,請嘗試使用exp=0
繪製mtcars
數據幀,您將看到我的意思)。
d2d = function(data, var1, var2, col, exp=0.005) {
# If the colour variable is numeric, convert to factor
if(is.numeric(data[,col])) {
data[,col] = as.factor(data[,col])
}
# Create plot, but expand x and y ranges well beyond data
p=ggplot(data, aes_string(var1, var2, colour=col)) +
geom_density_2d() +
scale_x_continuous(limits=c(min(data[,var1]) - 2*diff(range(data[,var1])),
max(data[,var1]) + 2*diff(range(data[,var1])))) +
scale_y_continuous(limits=c(min(data[,var2]) - 2*diff(range(data[,var2])),
max(data[,var2]) + 2*diff(range(data[,var2]))))
# Get min and max x and y values among all density contours
pb = ggplot_build(p)
xyscales = lapply(pb$data[[1]][,c("x","y")], function(var) {
rng = range(var)
rng + c(-exp*diff(rng), exp*diff(rng))
})
# Set x and y ranges to include complete density contours
ggplot(data, aes_string(var1, var2, colour=col)) +
geom_density_2d() +
scale_x_continuous(limits=xyscales[[1]]) +
scale_y_continuous(limits=xyscales[[2]])
}
試用功能上內置兩個數據集:
d2d(mtcars, "wt","mpg", "cyl")
d2d(iris, "Petal.Width", "Petal.Length", "Species")
這裏的地塊會是什麼樣默認x和y的範圍:
ggplot(mtcars, aes(wt, mpg, colour=factor(cyl))) + geom_density_2d()
ggplot(iris, aes(Petal.Width, Petal.Length, colour=Species)) + geom_density_2d()
如果你想控制軸的刻度線的數量,以及,你可以,例如,做這樣的事情:
d2d = function(data, var1, var2, col, nx=5, ny=5, exp=0.01) {
require(scales)
# If the colour variable is numeric, convert to factor
if(is.numeric(data[,col])) {
data[,col] = as.factor(data[,col])
}
# Create plot, but expand x and y ranges well beyond data
p=ggplot(data, aes_string(var1, var2, colour=col)) +
geom_density_2d() +
scale_x_continuous(limits=c(min(data[,var1]) - 2*diff(range(data[,var1])),
max(data[,var1]) + 2*diff(range(data[,var1])))) +
scale_y_continuous(limits=c(min(data[,var2]) - 2*diff(range(data[,var2])),
max(data[,var2]) + 2*diff(range(data[,var2]))))
# Get min and max x and y values among all density curves
pb = ggplot_build(p)
xyscales = lapply(pb$data[[1]][,c("x","y")], function(var) {
rng = range(var)
rng + c(-exp*diff(rng), exp*diff(rng))
})
# Set x and y ranges to include all of outer density curves
ggplot(data, aes_string(var1, var2, colour=col)) +
geom_density_2d() +
scale_x_continuous(limits=xyscales[[1]], breaks=pretty_breaks(n=nx)) +
scale_y_continuous(limits=xyscales[[2]], breaks=pretty_breaks(n=ny))
}
能否請您做一個[重複的例子(http://stackoverflow.com /問題/ 5963269 /如何對做 - 一個偉大-R-重複性,例如)? – Heroka
'geom_density_2d()'默認使用數據的限制。您需要計算ggplot以外的密度,根據相關密度水平計算所需限值並將其提供給ggplot中的比例。 – Thierry