我正在尝试使用stat_function()将一些分布添加到绘图中。我可以使用以下代码成功完成此操作:
library("ggplot2")
library("dplyr")
gg_color_hue <- function(n) {
hues = seq(15, 375, length=n+1)
hcl(h=hues, l=65, c=100)[1:n]
}
plotMixMdlComps <- function(x, mu, sigma, lam) {
lam * dnorm(x, mu, sigma )
}
clusterDf <- data.frame(cluster = c(6,5,4,8,0,7,3),
mu = c(0.73908779, 0.43233777, 0.28041006, 0.35627709,
0.09330585, 0.18250758, 0.56998734),
sigma = c(0.06472281, 0.03218096, 0.02779751,
0.02208605, 0.02716692, 0.01890661,
0.02995616),
lambda = c(0.042749908, 0.254485536, 0.205602343,
0.404705236, 0.061058220, 0.024166972,
0.007231783))
cols <- nrow(clusterDf) %>%
gg_color_hue()
inDf <- data.frame(x = c(0,1))
p <- ggplot(inDf, aes(x)) +
xlim(0,1) +
ylim(0,10)
for (i in 1:nrow(clusterDf)) {
p <- p + stat_function(geom = "line", fun = plotMixMdlComps,
arg = list(clusterDf[i, "mu"],
clusterDf[i, "sigma"],
clusterDf[i, "lambda"]),
lwd = 1.5, colour = cols[i])
}
p
这将生成如下图:
但是我想有一个传说出现。在线阅读后,看来我可以将color参数包装在aes()中,如下所示:
p <- ggplot(inDf, aes(x)) +
xlim(0,1) +
ylim(0,10)
for (i in 1:nrow(clusterDf)) {
p <- p + stat_function(geom = "line", fun = plotMixMdlComps,
arg = list(clusterDf[i, "mu"],
clusterDf[i, "sigma"],
clusterDf[i, "lambda"]),
lwd = 1.5, aes(colour = cols[i]))
}
p
但这最终生成了这样的情节,
我认为这与NSE有关(我仍然很难理解),NSE仅在调用cols [i]时才“解析” cols [i]。因此,每个stat_function最终都解析为具有相同的cols [i],应该是cols [7]。有没有办法让ggplot立即“解决”此问题,而不是等待调用p?
谢谢,
的帮助中stat_function
有一个示例,用于在同一图中显示两个功能。它还添加stat_function
两次并指定显式颜色,并且不会生成自动图例:
f <- ggplot(data.frame(x = c(0, 10)), aes(x))
f + stat_function(fun = sin, colour = "red") +
stat_function(fun = cos, colour = "blue")
因此,我怀疑用图例绘制多个函数不在的范围内stat_function
。
按照krlmlr的说明,您可以按如下方式创建数据集:
x <- seq(0,1,0.01)
names(clusterDf)[4]<-"lam"
fun_data <- lapply(1:nrow(clusterDf),function(i) {
args <- clusterDf[i,-1]
data.frame(cluster=clusterDf$cluster[i],
x=x,
y=do.call(plotMixMdlComps,c(list(x=x),args))
)
}) %>% bind_rows
现在可以使用ggplot直接绘制:
ggplot(fun_data,aes(x=x,y=y,colour=as.factor(cluster))) + geom_line(lwd=1.5)
这使ggplot可以为您选择颜色。如果要使用指定的颜色(在您的情况下,这些颜色与ggplot选择的颜色相同),则可以添加scale_colour_manual(values=cols)
到绘图中。
编辑:
或者,你也可以创建一个使用绘图数据mdply
从plyr
包:
library(plyr)
x <- seq(0,1,0.01)
names(clusterDf)[4]<-"lam"
fun_data <- mdply(clusterDf,function(cluster,mu,sigma,lam) {
data.frame(cluster=cluster,
x=x,
y=plotMixMdlComps(x,mu,sigma,lam)
)
}) %>% bind_rows
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句