我需要在一个图上有几个密度函数。每个密度对应于我的整个数据集的子集。子集由数据集中的一个变量所采用的值定义。
具体而言,我想绘制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
答案 0 :(得分:2)
处理依赖分组的一种方法是基于现有组创建独立分组。我选择在下面执行此操作的方法是使用<div style={{backgroundColor: "#FF0000"}}>red</div>
函数创建三个新列(period_one
,period_three
和period_ten
),其中
mutate
=期间的BEST_CUR_EV_TO_EBITDA值== 1 period_one
=期间&lt; = 1 period_three
=所有期间的BEST_CUR_EV_TO_EBITDA值然后使用period_ten
函数将这些列转换为长格式,其中列(gather
,period_one
和period_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)