2017-06-06 53 views
0

我需要將多個密度函數映射到一個圖上。每個密度對應於我整體數據集的一個子集。子集由數據集中其中一個變量所採用的值來定義。疊加密度,非排他性子集

具體而言,我想繪製一個3年和10年的密度函數。當然,十年的期限包括較短的期限。同樣,3年的地平線密度應該採用去年的數據構建。 子集需要對應於data[period == 1,],data[period <= 3, ],data[period == 10,]

我已經設法通過將geom_densitys彼此重疊,即通過每次重新定義數據來實現。

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 
+0

不是'數據[時間段== 1,]的'數據[時間段'部分< = 3,]'? –

+0

@AdamQuek是的。子集不相互排斥的事實是造成麻煩的原因。 – hartmut

回答

2

一個來處理相關分組的方法是創建基於現有組獨立的分組。我選擇了下面做的方式是通過與mutate功能,其中

  • period_one = BEST_CUR_EV_TO_EBITDA爲週期== 1的值
  • period_three = BEST_CUR_EV_TO_EBITDA價值創造三個新列(period_oneperiod_threeperiod_ten)爲週期< = 1
  • period_ten = BEST_CUR_EV_TO_EBITDA值的所有時段

這些colu然後使用gather函數將mns轉換成長格式,其中列(period_one,period_threeperiod_ten)被堆疊在「period」變量中,並且列「val」中的對應值被堆疊。

df2 <- data %>% 
    mutate(period_one=ifelse(period==1, BEST_CUR_EV_TO_EBITDA, NA), 
      period_three=ifelse(period<=3, BEST_CUR_EV_TO_EBITDA, NA), 
      period_ten=BEST_CUR_EV_TO_EBITDA) %>% 
    select(date, starts_with("period_")) %>% 
    gather(period, val, period_one, period_three, period_ten) 

的ggplot是直接用由獨立的分組長格式:

ggplot(df2, aes(val, fill=period)) + geom_density(alpha=.2) 

enter image description here

+0

完美,非常感謝。如果你有更多時間空閒,請不要猶豫,添加一些解釋。謝謝。 – hartmut

+0

在上面的答案中編輯瞭解釋。讓我知道你是否需要更多的解釋。 –