ggplot2绘制两个不同长度的矢量,从较小的一个开始

ggplot2绘制两个不同长度的矢量,从较小的一个开始

问题描述:

我正在使用R.我有一个每天回到1900年的表。一些矢量在1900年开始有些只在1950年开始等。我想根据日期向量绘制每个向量。不过,我想每一个情节开始时的y向量开始,而不是总是在1900年ggplot2绘制两个不同长度的矢量,从较小的一个开始

这里开始就是一个例子:

structure(list(Date = structure(c(5L, 6L, 7L, 8L, 1L, 2L, 3L, 
4L), .Label = c("1/3/1928", "1/4/1928", "1/5/1928", "1/6/1928", 
"12/28/1927", "12/29/1927", "12/30/1927", "12/31/1927"), class = "factor"), 
DJIA = c(198.6, 199.96, 200.7, 202.4, 203.35, 202.24, 199.61, 
201.45), SPX = c(NA, NA, NA, NA, 17.76, 17.72, 17.55, 17.66 
)), .Names = c("Date", "DJIA", "SPX"), class = "data.frame", row.names = c(NA, 
-8L)) 
+2

请提供获取剧情的SPX我们有一些数据,所以我们可以更好地解决您的问题 –

+0

谢谢@Jacob H您的兴趣。我不知道如何上传一个CSV文件到这个网站,所以我会给一个基本的描述。我的csv文件的前三栏是日期,道琼斯工业平均收盘价和标准普尔500收盘价。前两列的数据可追溯至1900年。然而,标准普尔开始于1928年,因此直到1928年才有空单元格。我使用ggplot2 geom_line来绘制每列与日期列的对应关系。我希望情节从每列的第一个值开始,而不是始终在1900年开始。 – MBA

+0

TY @JacobH不知道如何上传csv文件,所以我将举一个例子。前三列是日期,道琼斯工业平均收盘价和标准普尔500收盘价。前两列的数据可追溯至1900年。标准普尔开始于1928年,因此直到1928年才有空单元格。我使用ggplot2 geom_line来绘制每一列的日期。我希望情节从每列的第一个值开始,并不总是从1900开始。ggplot(master,aes(date,SPX))+ geom_line(stat =“identity”,na.rm = T)+ scale_x_date( labels = date_format(“%m /%d /%Y”),date_breaks ='5 years') – MBA

感谢您的更新!让我打电话给你的数据d

d <- structure(list(Date = structure(c(5L, 6L, 7L, 8L, 1L, 2L, 3L, 
           4L), .Label = c("1/3/1928", "1/4/1928", "1/5/1928", "1/6/1928", 
               "12/28/1927", "12/29/1927", "12/30/1927", "12/31/1927"), class = "factor"), 
      DJIA = c(198.6, 199.96, 200.7, 202.4, 203.35, 202.24, 199.61, 
        201.45), SPX = c(NA, NA, NA, NA, 17.76, 17.72, 17.55, 17.66 
        )), .Names = c("Date", "DJIA", "SPX"), class = "data.frame", row.names = c(NA, 
                           -8L)) 

与此数据的第一个问题是,Date是一个因素,正确地绘制,我们首先需要将其更改为Date

d$Date <- as.Date(d$Date, "%m/%d/%Y") 

的最简单方法实现你想要的输出是删除NA如下

ggplot(d[complete.cases(d[,c("Date", "SPX")]), ], aes(x = Date, y = SPX)) + 
    geom_line() 

但是,我怀疑你会是g大量的这些数字。创建你自己的剧情功能可能是一个更好的主意。

myplot <- function(data, myX, myY){ 
    data <- data[complete.cases(data[,c(myX, myY)]), ] 
    ggplot(data, aes_string(x = myX, y = myY))+ 
    geom_line() 
} 

通知的aes_string,这简化了变量名的传递。有可能使用aes,但它有点复杂。

有了这个功能,你可以绘制各列的代码现在

myCOL <- c("DJIA", "SPX") #names of columns, note they are in quotes. This is because we're using aes_string 

allPLOT <- lapply(myCOL, function(x) myplot(d, "Date", x)) 

names(allPLOT) <- myCOL #naming the elements of the list 

所有的地块都存储在一个列表,例如,你可以通过调用

allPLOT$SPX 
+0

当我使用你的第一个版本时,我得到这个错误:geom_path:每个组只包含一个观察。你需要调整团体审美吗? – MBA

+0

谢谢你的帮助@JacobH,但是当我尝试你的第二个版本时,我得到了这个错误:geom_path:每个组只包含一个观察值。你需要调整团体审美吗?尽管x轴开始于y值开始时没有任何显示 – MBA

+0

我明白了!由于某种原因,我不能 – MBA