2017-06-06 3 views
0

1つのプロットに複数の密度関数を持たせる必要があります。各密度は、私の全体的なデータセットのサブセットに対応しています。サブセットは、データセット内の変数の1つによって取られた値によって定義されます。重畳密度、非排他的サブセット

具体的には、1年、3年、10年の地平線の密度関数を描きたいと思います。もちろん、10年の視野には短いものも含まれます。同様に、3年間の地平線密度は、昨年のデータを用いて構築する必要があります。 サブセットは、data[period == 1,],data[period <= 3, ],data[period == 10,]に対応する必要があります。

私はgeom_densityを互いに重ね合わせて、つまりそのたびにデータを再定義することによってこれを行うことができました。

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値と3つの新しい列(period_oneperiod_threeperiod_ten)を作成することです全期間の期間< = 1
  • period_ten = BEST_CUR_EV_TO_EBITDA値

これらcolu列は(period_one,period_threeおよびperiod_ten)が「期間」変数に積み重ねられ、対応する値が列「val」に積まれたgather関数を使用して長形式に変換されました。

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

上記の説明で説明を編集しました。あなたにもっと説明が必要なのかどうか教えてください。 –

関連する問題