R - ggplot - 覆盖单点的线图,geom_points()的空系列导致错误

时间:2016-08-21 18:37:48

标签: r

geom_point的空系列问题

我正在尝试为模拟价格系列的线图创建一个可重复的例程,其中叠加了标记买(蓝点)和卖(红点)点的点。

在某些情况下,没有买入或卖出点为geom_point创建一个空对象,因此它会给出错误并阻止完成图表。

有效的示例(存在买卖点)

Time <- c(seq(1,12,1))
Prices <- c(36.23, 35.87, 36.18, 36.54, 35.96, 36.68, 37.16, 37.69, 38.15, 38.61, 39.91, 40.45)
TradingPrice_BUY <- c(36.23,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
TradingPrice_SELL <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,39.91,NA)
Trades<-data.frame(Time ,Prices, TradingPrice_BUY, TradingPrice_SELL)

library(ggplot2)
ggplot(data=Trades,aes(x=Time,y=Prices,group=1)) + 
theme_bw() + geom_line() + xlab("Time") + ylab("Price") +
  geom_point(data=Trades, aes(x=Time,y=TradingPrice_BUY),color="blue",shape=19) + 
  geom_point(data=Trades, aes(x=Time,y=TradingPrice_SELL),color="red",shape=19) 



卖点不存在的情况示例
错误:提供给连续刻度的离散值

Time <- c(seq(1,12,1))
Prices <- c(36.23, 35.87, 36.18, 36.54, 35.96, 36.68, 37.16, 37.69, 38.15, 38.61, 39.91, 40.45)
TradingPrice_BUY <- c(36.23,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
TradingPrice_SELL <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
Trades<-data.frame(Time ,Prices, TradingPrice_BUY, TradingPrice_SELL)

library(ggplot2)
ggplot(data=Trades,aes(x=Time,y=Prices,group=1)) + 
theme_bw() + geom_line() + xlab("Time") + ylab("Price") +
  geom_point(data=Trades, aes(x=Time,y=TradingPrice_BUY),color="blue",shape=19) + 
  geom_point(data=Trades, aes(x=Time,y=TradingPrice_SELL),color="red",shape=19) 



我试图解决它,但又出现了另一个错误 错误:美学必须是长度1或与数据(1)相同:x,y,组

ggplot(data=Trades,aes(x=Time,y=Prices,group=1)) + 
theme_bw() +geom_line()+xlab("Time") + ylab("Price")+
geom_point(data=subset(Trades,!is.na(Trades$TradingPrice_BUY)),aes(x=Time,y=TradingPrice_BUY),color="blue",shape=19) + 
  geom_point(data=subset(Trades,is.na(Trades$TradingPrice_BUY)), aes(x=1,y=Prices[1]),color=NA) +
  geom_point(data=subset(Trades,!is.na(Trades$TradingPrice_SELL)), aes(x=Time,y=TradingPrice_SELL),color="red",shape=19) +
  geom_point(data=subset(Trades,is.na(Trades$TradingPrice_SELL)),aes(x=1,y=Prices[1]),color=NA)



如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

使用ggplot进行绘图时,您需要将数据保存在“整洁”状态。事物的格式很好地工作。不是为不同的点添加不同的图层,而是应该重塑数据并让美学为您处理格式。在这里,我使用reshape2::melt来&#34; tidy&#34;你的数据。例如

point_data <- na.omit(reshape2::melt(Trades[c(1,3,4)], "Time"))
ggplot(data=Trades,aes(x=Time, y=Prices)) + 
    theme_bw() + geom_line() + xlab("Time") + ylab("Price") +
    geom_point(data=point_data, aes(x=Time, y=value, color=variable), shape=19) + 
    scale_color_manual(values=c(
        "TradingPrice_BUY"="blue", 
        "TradingPrice_SELL"="red"), guide=FALSE)

这应该可以正常工作