使用R构造特定的时间序列图

时间:2013-12-10 18:46:48

标签: r datetime plot

我的问题是我从正态分布生成时间序列并绘制我的时间序列,但我想在时间序列和斧X之间的正面区域用红色着色,对于X轴下方的负面区域也是如此和我的时间序列。

这是我使用的代码,但不起作用:

 x1<-rnorm(250,0.4,0.9)
x <- as.matrix(x1)
t <- ts(x[,1], start=c(1,1), frequency=30)
plot(t,main="Daily closing price of Walterenergie",ylab="Adjusted close Returns",xlab="Times",col="blue")

plot(t,xlim=c(2,4),main="Daily closing price of Walterenergie",ylab="Adjusted close Returns",xlab="Times",col="blue")
abline(0,0)  

z1<-seq(2,4,0.001)
cord.x <- c(2,z1,4) 
cord.y <- c(0,t(z1),0) 
polygon(cord.x,cord.y,col='red')

enter image description here

3 个答案:

答案 0 :(得分:4)

编辑:响应OP的其他查询。

library(ggplot2)
df      <- data.frame(t=1:nrow(x),y=x)
df$fill <- ifelse(x>0,"Above","Below")
ggplot(df)+geom_line(aes(t,y),color="grey")+
  geom_ribbon(aes(x=t,ymin=0,ymax=ifelse(y>0,y,0)),fill="red")+
  geom_ribbon(aes(x=t,ymin=0,ymax=ifelse(y<0,y,0)),fill="blue")+
  labs(title="Daily closing price of Walterenergie",
       y="Adjusted close Returns",
       x="Times")

原始回复:

这是你的想法吗?

enter image description here

library(ggplot2)
df <- data.frame(t=1:nrow(x),y=x)
ggplot(df)+geom_line(aes(t,y),color="grey")+
  geom_ribbon(aes(x=t,ymin=0,ymax=y),fill="red")+
  labs(title="Daily closing price of Walterenergie",
       y="Adjusted close Returns",
       x="Times")

答案 1 :(得分:3)

这是我刚才为某人写过的一些代码。在这种情况下,两种不同的颜色用于正面和负面。虽然这不是你想要的,但我想我会分享这个。

# Set a seed to get a reproducible example
set.seed(12345)

num.points <- 100

# Create some data
x.vals <- 1:num.points
values <- rnorm(n=num.points, mean=0, sd=10)

# Plot the graph
plot(x.vals, values, t="o", pch=20, xlab="", ylab="", las=1)
abline(h=0, col="darkgray", lwd=2)

# We need to find the intersections of the curve with the x axis
# Those lie between positive and negative points
# When the sign changes the product between subsequent elements
# will be negative
crossings <- values[-length(values)] * values[-1]
crossings <- which(crossings < 0)

# You can draw the points to check (uncomment following line)
# points(x.vals[crossings], values[crossings], col="red", pch="X")

# We now find the exact intersections using a proportion
# See? Those high school geometry problems finally come in handy
intersections <- NULL
for (cr in crossings)
  {
  new.int <- cr + abs(values[cr])/(abs(values[cr])+abs(values[cr+1]))
  intersections <- c(intersections, new.int)
  }

# Again, let's check the intersections
# points(intersections, rep(0, length(intersections)), pch=20, col="red", cex=0.7)

last.intersection <- 0
for (i in intersections)
  {
  ids <- which(x.vals<=i & x.vals>last.intersection)
  poly.x <- c(last.intersection, x.vals[ids], i)
  poly.y <- c(0, values[ids], 0)
  if (max(poly.y) > 0)
    {
    col="green"
    }
  else
    {
    col="red"
    }
  polygon(x=poly.x, y=poly.y, col=col)

  last.intersection <- i
  }

这是the result

enter image description here

答案 2 :(得分:1)

基础绘图解决方案:

x1<-rnorm(250,0.4,0.9)
x <- as.matrix(x1)
# t <- ts(x[,1], start=c(1,1), frequency=30)
plot(x1,main="Daily closing price of Walterenergie",ylab="Adjusted close Returns",xlab="Times",col="blue", type="l")
polygon( c(0,1:250,251), c(0, x1, 0) , col="red")

请注意,这并不涉及时间序列绘图方法,因为频率值的比例和起始x值为1的差异很难理解。解决方法如下:

plot(t,main="Daily closing price of Walterenergie",
         ylab="Adjusted close Returns",xlab="Times",col="blue", type="l")
polygon( c(1,1+(0:250)/30), c(0, t, 0) , col="red")

enter image description here