我需要將多個密度函數映射到一個圖上。每個密度對應於我整體數據集的一個子集。子集由數據集中其中一個變量所採用的值來定義。疊加密度,非排他性子集
具體而言,我想繪製一個3年和10年的密度函數。當然,十年的期限包括較短的期限。同樣,3年的地平線密度應該採用去年的數據構建。 子集需要對應於data[period == 1,]
,data[period <= 3, ]
,data[period == 10,]
。
我已經設法通過將geom_density
s彼此重疊,即通過每次重新定義數據來實現。
ggplot() +
geom_density(data = data[period <=3,], aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="red") +
geom_density(data = data[period ==1,], aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="grey") +
geom_density(data = data, aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="green")
它工作正常,但我覺得這是不這樣做的正確方法(實際上,它使得例如,一個傳奇繁瑣的創建)。
在另一方面,做這樣的:
ggplot(data, aes(x=BEST_CUR_EV_TO_EBITDA, color=period)) +
geom_density(alpha=.2, fill="blue")
不會做,因爲這樣的時間段被認爲是相互排斥的。
有沒有一種方法可以根據period
所取的值指定aes(color)
,其中子集重疊?
運行代碼:
library(data.table)
library(lubridate)
library(ggplot2)
YEARS <- 10
today <- Sys.Date()
lastYr <- Sys.Date()-years(1)
last3Yr <- Sys.Date()-years(3)
start.date = Sys.Date()-years(YEARS)
date = seq(start.date, Sys.Date(), by=1)
BEST_CUR_EV_TO_EBITDA <- rnorm(length(date), 3,1)
data <- cbind.data.frame(date, BEST_CUR_EV_TO_EBITDA)
data <- cbind.data.frame(data, period = rep(10, nrow(data)))
subPeriods <- function(aDf, from, to, value){
aDf[aDf$date >= from & aDf$date <= to, "period"] = value
return(aDf)
}
data <- subPeriods(data, last3Yr, today, 3)
data <- subPeriods(data, lastYr, today, 1)
data <- data.table(data)
colScale <- scale_colour_manual(
name = "horizon"
, values = c("1 Y" = "grey", "3 Y" = "red", "10 Y" = "green"))
ggplot() +
geom_density(data = data[period <=3,], aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="red") +
geom_density(data = data[period ==1,], aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="grey") +
geom_density(data = data, aes(x=BEST_CUR_EV_TO_EBITDA), alpha=.2, fill="green") +
colScale
不是'數據[時間段== 1,]的'數據[時間段'部分< = 3,]'? –
@AdamQuek是的。子集不相互排斥的事實是造成麻煩的原因。 – hartmut