2016-08-21 7 views
0

Problem mit leerer Serie für geom_pointR - ggplot - darüber liegendes Liniendiagramm mit einzelnen Punkten, leere Serie für geom_points() verursacht Fehler

Ich versuche, eine wiederholbare Routine für ein Liniendiagramm für simulierte Preisreihen zu erstellen welche mit Punkten überlagert sind, die die Punkte kaufen (blaue Punkte) und verkaufen (rote Punkte) markieren.

In einigen Fällen gibt es keine Kauf- oder Verkaufspunkte, die ein leeres Objekt für geom_point erstellen, so dass es einen Fehler gibt und die Fertigstellung des Diagramms verhindert.

Beispiel die funktioniert (Kauf- und Verkaufspunkte existieren)

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) 



Beispiel für den Fall, dass sell Punkte existieren nicht
Fehler: Discrete Wert auf kontinuierliche Skala geliefert

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) 



ich versuchte, um ihn herum zu arbeiten, bekam aber andere Fehler
Fehler: Ästhetik müssen entweder Länge 1 oder die gleichen wie die Daten (1) sein: x, y, Gruppe

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) 



Wie umgehen Sie dieses Problem?

Antwort

2

Beim Plotten mit ggplot müssen Sie Ihre Daten in einem "aufgeräumten" Format halten, damit die Dinge gut funktionieren. Anstatt verschiedene Ebenen für unterschiedliche Punkte hinzuzufügen, sollten Sie Ihre Daten neu gestalten und die Ästhetik für die Formatierung übernehmen. Hier habe ich reshape2::melt verwendet, um Ihre Daten zu "säubern". Zum Beispiel

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) 

Dies sollte fein

arbeiten
Verwandte Themen