图例未使用 ggplot2 在多密度图中绘制
legend not plotting in multiple densities plot using ggplot2
正如标题所说,下面的函数根据传递的数据绘制了许多密度,不绘制图例。 MWE:
plotDensities <- function(xlab="", xlim=c(), ...) {
datas <- list(...)
cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
if (length(datas) > length(cbPalette)) return(invisible(NULL))
dplot <- ggplot() + xlab(xlab) +
scale_colour_manual(values=setNames(cbPalette[1:length(datas_names)], datas_names)) +
theme(legend.position = c(.8, .8))
datas_names <- names(datas)
for (i in 1:length(datas)) {
name <- datas_names[i]
values <- data.frame(x=datas[[name]])
dplot <- dplot + geom_density(aes(x=x), colour=cbPalette[i], data=values)
}
if (!is.null(xlim))
dplot <- dplot + xlim(xlim)
return(invisible(dplot))
}
v1 <- rnorm(2000, 0, 1)
v2 <- rnorm(3000, 1, 1.5)
v3 <- rnorm(4000, 2, 2.5)
dplot <- plotDensities(xlim="whatever", v1=v1, v2=v2, v3=v3)
dplot
当您将数据中的列映射到 aes
内的美学(例如,colour
、fill
等)时,ggplot
会生成一个图例。但是,您的代码在调用 geom_density
时将 colour
设置在 aes
之外,这不会产生图例。
此外,您的数据被拆分成单独的向量。但是,当您有一个 "long" 格式的数据框时,ggplot
效果最佳。在这种情况下,这意味着将 v1
、v2
和 v3
组合成一个数据框,另一列标记每行最初来自哪个向量。
这是一个简单的示例,使用您的数据,您可以将其应用到您的函数中:
# Convert data to long format
dat = data.frame(vals=c(v1,v2,v3),
source=rep(c("v1","v2","v3"),sapply(list(v1,v2,v3), length)))
dat
vals source
1 -0.2860619 v1
2 1.8072476 v1
3 -0.6492385 v1
...
8998 3.8989335 v3
8999 5.1929588 v3
9000 1.8716558 v3
ggplot(dat, aes(vals, colour=source)) +
geom_density() +
scale_colour_manual(values=cbPalette[1:length(unique(dat$source))])
正如标题所说,下面的函数根据传递的数据绘制了许多密度,不绘制图例。 MWE:
plotDensities <- function(xlab="", xlim=c(), ...) {
datas <- list(...)
cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
if (length(datas) > length(cbPalette)) return(invisible(NULL))
dplot <- ggplot() + xlab(xlab) +
scale_colour_manual(values=setNames(cbPalette[1:length(datas_names)], datas_names)) +
theme(legend.position = c(.8, .8))
datas_names <- names(datas)
for (i in 1:length(datas)) {
name <- datas_names[i]
values <- data.frame(x=datas[[name]])
dplot <- dplot + geom_density(aes(x=x), colour=cbPalette[i], data=values)
}
if (!is.null(xlim))
dplot <- dplot + xlim(xlim)
return(invisible(dplot))
}
v1 <- rnorm(2000, 0, 1)
v2 <- rnorm(3000, 1, 1.5)
v3 <- rnorm(4000, 2, 2.5)
dplot <- plotDensities(xlim="whatever", v1=v1, v2=v2, v3=v3)
dplot
aes
内的美学(例如,colour
、fill
等)时,ggplot
会生成一个图例。但是,您的代码在调用 geom_density
时将 colour
设置在 aes
之外,这不会产生图例。
此外,您的数据被拆分成单独的向量。但是,当您有一个 "long" 格式的数据框时,ggplot
效果最佳。在这种情况下,这意味着将 v1
、v2
和 v3
组合成一个数据框,另一列标记每行最初来自哪个向量。
这是一个简单的示例,使用您的数据,您可以将其应用到您的函数中:
# Convert data to long format
dat = data.frame(vals=c(v1,v2,v3),
source=rep(c("v1","v2","v3"),sapply(list(v1,v2,v3), length)))
dat
vals source 1 -0.2860619 v1 2 1.8072476 v1 3 -0.6492385 v1 ... 8998 3.8989335 v3 8999 5.1929588 v3 9000 1.8716558 v3
ggplot(dat, aes(vals, colour=source)) +
geom_density() +
scale_colour_manual(values=cbPalette[1:length(unique(dat$source))])