我想用 ggplot2 做一个图表,其中我需要截距 (=1) 和值(我通过 geom_line 连接)之间的空间/面积为红色(如果值小于 1)或绿色(如果值大于 1)。数据来自微软(自 1999 年以来的价格表现)。
数据:
require(quantmod)
require(dplyr)
require(ggplot2)
getSymbols("MSFT", from ="1999-01-01")
microsoft <- data.frame(time(MSFT), MSFT[,6])
microsoft$time <- as.Date(microsoft$time.MSFT., "%Y-%m-%d")
microsoft <- microsoft %>%
mutate(change = MSFT.Adjusted - first(MSFT.Adjusted),
change.pc = change/first(MSFT.Adjusted)+1)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的ggplot:
ggplot(microsoft, aes(x = time, y = change.pc)) +
geom_line(stat = "identity") +
geom_hline(aes(yintercept=1), color="black") +
theme_bw() +
xlab("Jahr") + ylab("") +
ggtitle("Microsoft Kursentwicklung seit Januar 1999")
Run Code Online (Sandbox Code Playgroud)
我想用绿色填充 y = 1 和上面的值之间的空间,用红色填充 y = 1 和下面的值之间的空间。我尝试了 geom_ribbon、geom_area、geom_polynom,但没有任何效果。最大的问题是,它填充了绿色空间,但不是在线 y = 1 以上,但也低于在线。还有你看不到的红色……
这是我尝试过的:
geom_area(data = subset(microsoft, change.pc > 1), fill = "green", alpha =0.5)
geom_area(data = subset(microsoft, change.pc < 1), fill = "red", alpha = 0.5)
Run Code Online (Sandbox Code Playgroud)
我把这些放在我的情节中的线条上,然后我上面描述的问题出现了。
除其他外,我也尝试过这个(在 stackoverflow.com 上找到):
microsoft$grp <- "orig"
microsoft <- microsoft[order(microsoft$time),]
microsoft_new <- do.call("rbind",
sapply(1:(nrow(microsoft) -1), function(i){
f <- lm(time ~ change.pc, microsoft[i:(i+1), ])
if (f$qr$rank < 2) return(NULL)
r <- predict(f, newdata = data.frame(change.pc = 0))
if(microsoft[i, ]$time < r & r < microsoft[i+1, ]$time)
return(data.frame(time = r, change.pc = 0))
else return(NULL)
})
)
microsoft_2 <- rbind(microsoft, microsoft_new)
ggplot(microsoft_2, aes(x = time, y = change.pc)) +
geom_area(data = subset(microsoft_2, change.pc <= 1), fill = "red") +
geom_area(data = subset(microsoft_2, change.pc >= 1), fill = "blue") +
scale_x_continuous("", expand = c(0,0), breaks = seq(1999, 2017, 3)) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)
那也没有用。有谁知道我如何实现我的需要?这是它应该看起来的样子
我无法让您的数据工作,但使用一些虚构的数据,以下方法看起来像您的示例:
library(ggplot2)
set.seed(0)
microsoft <- data.frame(date=1:1000, y=cumsum(runif(1000)-0.5))
ggplot(microsoft, aes(x=date,y=y)) +
geom_ribbon(aes(ymin=pmin(microsoft$y,0), ymax=0), fill="red", col="red", alpha=0.5) +
geom_ribbon(aes(ymin=0, ymax=pmax(microsoft$y,0)), fill="green", col="green", alpha=0.5) +
geom_line(aes(y=0))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3477 次 |
最近记录: |