简体   繁体   中英

Is there an equivalent to points() on ggplot2

I'm working with stock prices and trying to plot the price difference. I created one using autoplot.zoo() , my question is, how can I manage to change the point shapes to triangles when they are above the upper threshold and to circles when they are below the lower threshold. I understand that when using the basic plot() function you can do these by calling the points() function, wondering how I can do this but with ggplot2 .

Here is the code for the plot:

p<-autoplot.zoo(data, geom = "line")+
        geom_hline(yintercept = threshold, color="red")+
        geom_hline(yintercept = -threshold, color="red")+
        ggtitle("AAPL vs. SPY out of sample")
p+geom_point()

情节图片

We can't fully replicate without your data, but here's an attempt with some sample generated data that should be similar enough that you can adapt for your purposes.

# Sample data
data = data.frame(date = c(2001:2020),
                  spread = runif(20, -10,10))

# Upper and lower threshold
thresh <- 4

You can create an additional variable that determines the shape, based on the relationship in the data itself, and pass that as an argument into ggplot.

# Create conditional data
data$outlier[data$spread > thresh] <- "Above"
data$outlier[data$spread < -thresh] <- "Below"
data$outlier[is.na(data$outlier)] <- "In Range"

library(ggplot2)
ggplot(data, aes(x = date, y = spread, shape = outlier, group = 1)) +
  geom_line() +
  geom_point() +
  geom_hline(yintercept = c(thresh, -thresh), color = "red") +
  scale_shape_manual(values = c(17,16,15))

在此处输入图像描述

# If you want points just above and below# Sample data
data = data.frame(date = c(2001:2020),
                  spread = runif(20, -10,10))
thresh <- 4
data$outlier[data$spread > thresh] <- "Above"
data$outlier[data$spread < -thresh] <- "Below"
ggplot(data, aes(x = date, y = spread, shape = outlier, group = 1)) +
  geom_line() +
  geom_point() +
  geom_hline(yintercept = c(thresh, -thresh), color = "red") +
  scale_shape_manual(values = c(17,16))

在此处输入图像描述

Alternatively, you can just add the points above and below the threshold as individual layers with manually specified shapes, like this. The pch argument points to shape type.

# Another way of doing this

data = data.frame(date = c(2001:2020),
                  spread = runif(20, -10,10))

# Upper and lower threshold
thresh <- 4

ggplot(data, aes(x = date, y = spread, group = 1)) +
  geom_line() +
  geom_point(data = data[data$spread>thresh,], pch = 17) +
  geom_point(data = data[data$spread< (-thresh),], pch = 16) + 
  geom_hline(yintercept = c(thresh, -thresh), color = "red") +
  scale_shape_manual(values = c(17,16))

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM