2017-06-30 2 views
0

Ich brauche Hilfe, um eine wirklich einfache Handlung zu machen. Es ist nur ein Liniendiagramm mit einer begleitenden Zeile für eine andere Menge von Preisen (sie sind beide Zeitreihen, eine Linie für jedes Gut. X = Preise, Y = Zeit). Also ich habe einen Datensatz, der das Format folgt:Kann keine Serie zum Plot hinzufügen

#Date prices1 prices2 

Die Termine alle folgen dem Format YYYY-MM-DD und die beiden Preisspalten sind Zahlen. Ich habe die Klasse aller drei Spalten überprüft, um sicherzustellen, dass sie das sind, was sie sein sollen ("Datum", "numerisch" bzw. "numerisch"). Auch ein paar Dinge, die ich glaube, ich sollte erwähnen:

  • Die Daten wurden von einem Quandl() Aufruf abgerufen, und die Längen der ursprünglichen Datenrahmen unterschiedlich waren. Also musste ich mich ihnen mit dem full_join anschließen. Ich habe immer noch die Klasse() für jede Spalte im endgültigen Datenrahmen überprüft und sie sind korrekt.

  • Die price1 Spalte hat eine Länge von 91, während price2 Spalte eine Länge von 100 hat. Ich dachte zunächst, dies war die Ursache des Problems. Aber nachdem ich df$price2[92:100] = NA eingestellt habe, habe ich immer noch das gleiche Problem (ich kann jede der Zeilen getrennt darstellen, aber beide erscheinen nicht, wenn ich die Funktion lines() verwende).

  • Außerdem habe ich ein separates Skript, wo ich einen dreispaltigen Datenrahmen, wo ich für den 11. bis 20. Werte von col2 100 Spalten und NA für die ersten zehn Werte von col1, NA, etc. haben

Jetzt habe ich sie nicht zu einem Zeitreihenobjekt gemacht und sie einfach als normale Datenframes dargestellt. Ich kann beide von ihnen auf ihre eigene plotten, aber ich kann nicht für das Leben von mir eine plotten und die Linien() Funktion für die andere verwenden. Was könnte ich vermissen? Wenn NA 's das Problem sind, warum kann ich das zweizeilige Diagramm mit den Quandl-Daten nicht machen, während meine Testdaten gut ausgegangen sind?

Aufgrund der Umstände des Problems habe ich beschlossen, das Quandl-Skript und das Testskript zu teilen.

#Original Script with issues 
#Retrieving Data1 
library(dplyr) 
library(zoo) 
library("Quandl") 

data.1 = Quandl("JODI/OIL_TCPRKL_VEN") 
#Putting data in chronological order 

     #not in order 
     print(data.1$Date[1]) 
     print(data.1$Date[length(data.1$Date)]) 

data.1 = data.frame(
    data.1$Date[length(data.1$Date):1], 
    data.1$Value[length(data.1$Value):1] 
) 
names(data.1) = c("Date", "Value1") 

     #Now in order 
     print(data.1$Date[1]) 
     print(data.1$Date[length(data.1$Date)]) 





#Retrieving data2 
data.2 = Quandl("JODI/OIL_TCPRKB_IRQ") 

     #not in order 
     print(data.2$Date[1]) 
     print(data.2$Date[length(data.2$Date)]) 

data.2 = data.frame(
    data.2$Date[length(data.2$Date):1], 
    data.2$Value[length(data.2$Value):1] 
) 
names(data.2) = c("Date", "Value2") 

     #now in order 
     print(data.2$Date[1]) 
     print(data.2$Date[length(data.2$Date)]) 


#join the data 
data.join = data.frame(full_join(data.1, data.2)) 


plot(data.join$Date, data.join$Value1, 
    col = "blue", 
    main = "Should have both lines", 
    type = "l", 
    sub = "only one of them shows up though. Why?", 
    xlab = "Date", 
    ylab = "Values") 
lines(data.join$Value2) 
#plot only has one line. Why?? 

Hier ist auch ein Testskript ich gemacht, wo ich scheine nicht das Problem mit zu sein.

library(dplyr) 
library(zoo) 


time.a = as.Date(c(10:30)) 
time.b = as.Date(c(20:40)) 
time.c = as.Date(c(30:50)) 

value.a = as.numeric(seq(10,30,1)) 
value.b = as.numeric(seq(20,60,2)) 
value.c = as.numeric(seq(20,30,.5)) 

    length(time.a) 
    length(time.b) 
    length(time.c) 

    length(value.a) 
    length(value.b) 
    length(value.c) 


    print(time.a) 
    print(time.b) 
    print(time.c) 

    print(value.a) 
    print(value.b) 
    print(value.c) 



data.a = data.frame(time.a, value.a) 
data.b = data.frame(time.b, value.b) 
data.c = data.frame(time.c, value.c) 

names(data.a) = c("Date", "Value.a") 
names(data.b) = c("Date", "Value.b") 
names(data.c) = c("Date", "Value.c") 

all.data = full_join(data.a, data.b) 
all.data = full_join(all.data, data.c) 


plot(all.data$Date, all.data$Value.a, 
    type = "l", 
    main = "plot", 
    xlab = "Date", 
    ylab = "Values") 

lines(all.data$Date, all.data$Value.b, 
     col = "blue") 


lines(all.data$Date, all.data$Value.c, 
     col = "red") 

Ich versuche wirklich zu verstehen, warum das erste Skript nicht funktioniert, während mein zweites tut. Jede Hilfe oder Hinweise würden sehr geschätzt werden. Why doesn't it work?

+0

Sind sie in demselben Bereich? Ihr erster 'Plot'-Aufruf definiert den Bereich der Y-Achse. Standardmäßig wird es an Ihre y-Werte angepasst.Wenn Ihre erste Serie beispielsweise Werte zwischen 1 und 10 hat und Ihre zweite Serie Werte zwischen 50 und 70 hat, liegt sie außerhalb des Bereichs und wird nicht angezeigt. Sie können im Aufruf 'plot()' 'ylim' angeben, um den Standardwert zu überschreiben. – Gregor

+0

@Gregor Ich habe das auch berücksichtigt. Ich habe die Bereichsfunktion verwendet und das habe ich jeweils bekommen. 'Bereich (na.omit (data.join $ Wert1)) [1] 11.275,4 15.071,7 Bereich (data.join $ Wert2) [1] 62440 151621' I Grafik auch geprüft, während der Bereich einstellen. Trotzdem, die Linien zeigen sich nicht. – im2wddrf

+0

Wofür haben Sie den Bereich festgelegt, da diese Bereiche sich nicht überschneiden? Es scheint in der Tat das Problem zu sein. Der allgemeine Weg besteht darin, 'ylim = c (min (c (Daten.join $ Wert1, data.join $ Wert2), na.rm = T), max (c (Daten.join $ Wert1, data.join $ Wert2) zu setzen), na.rm = T)) ' – Gregor

Antwort

0

Ihr Problem ist die y-Bereiche.

Ihre Beispieldaten:

df = structure(list(Date = structure(c(14275, 14303, 14334, 14364, 14395, 
14425), class = "Date"), Value1 = c(14347.197, 12856.3706, 14623.1995, 
13998.8553, 14381.6974, 13688.8295), Value2 = c(68603, 62440, 73439, 
69930, 72850, 73500)), .Names = c("Date", "Value1", "Value2"), row.names = 
c(NA, 6L), class = "data.frame") 

Wir können sehen, dass, dass die Bereiche überlappende nirgendwo in der Nähe sind, so dass man die Grenzen des Grundstücks vordefinieren müssen:

df_range = range(c(df$Value1, df$Value2), na.rm = T) 
plot(df$Date, df$Value1, type = "l", ylim = df_range)) 
lines(df$Date, df$Value2, col = "firebrick4") 

enter image description here

Verwandte Themen