叠加密度,非独占子集

时间:2017-06-06 08:00:08

标签: r ggplot2

我需要在一个图上有几个密度函数。每个密度对应于我的整个数据集的子集。子集由数据集中的一个变量所采用的值定义。

具体而言,我想绘制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")

不会这样做,因为这些时期被认为是相互排斥的。

有没有办法根据aes(color)子集重叠的值来指定period

正在运行代码:

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 个答案:

答案 0 :(得分:2)

处理依赖分组的一种方法是基于现有组创建独立分组。我选择在下面执行此操作的方法是使用<div style={{backgroundColor: "#FF0000"}}>red</div> 函数创建三个新列(period_oneperiod_threeperiod_ten),其中

  • mutate =期间的BEST_CUR_EV_TO_EBITDA值== 1
  • period_one =期间&lt; = 1
  • 的BEST_CUR_EV_TO_EBITDA值
  • period_three =所有期间的BEST_CUR_EV_TO_EBITDA值

然后使用period_ten函数将这些列转换为长格式,其中列(gatherperiod_oneperiod_three)堆叠在“句点”变量中,以及“val”列中的相应值。

period_ten

ggplot很简单,长格式由独立分组组成:

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)

enter image description here