使用函数在R中绘图

时间:2014-05-21 22:55:01

标签: r function plot dataframe

我有一个名为EWMA_SD252 3561 obs的数据框。 102个变量(自2000年以来100股的每日波动率),这是一个样本:

     Data       IBOV     ABEV3    AEDU3    ALLL3
3000 2012-02-09 16.88756 15.00696 33.46089 25.04788
3001 2012-02-10 18.72925 14.55346 32.72209 24.93913
3002 2012-02-13 20.87183 15.25370 31.91537 24.28962
3003 2012-02-14 20.60184 14.86653 31.04094 28.18687
3004 2012-02-15 20.07140 14.56653 37.45965 33.47379
3005 2012-02-16 19.99611 16.80995 37.36497 32.46208
3006 2012-02-17 19.39035 17.31730 38.85145 31.50452

我想要做的是使用单个命令,使用日期参考来分配特定股票的区间,并绘制相同区间的图表,到目前为止,我能够做到子集部分,但现在我是坚持绘制图表,这是我到目前为止的代码:

获取日期间隔和股票名称:

    datas = function(x,y,z){
    intervalo_datas(as.Date(x,"%d/%m/%Y"),as.Date(y,"%d/%m/%Y"),z)
    } 

子集数据:

 intervalo_datas <- function(x,y,z){
 cbind(as.data.frame(EWMA_SD252[,1]),as.data.frame(EWMA_SD252[,z]))[EWMA_SD252$Data >= x    & EWMA_SD252$Data <= y,]
 } 

现在我被卡住了,是否可以使用函数来获取ABEV3 data.frame并使用日期在X中绘制图表并使用y中的波动率绘制图表,仅使用下面的命令?

  

ABEV3 =数据(&#34; 09/02 / 2012&#34;,&#34; 17/02 / 2012&#34;,&#34; ABEV3&#34;)

3 个答案:

答案 0 :(得分:3)

我认为你应该使用xts包。它很合适:

  • 操纵时间序列特别是金融时间序列
  • 子集时间序列
  • 绘制时间序列

所以我会使用你的数据创建一个xts对象。然后我将子集/绘图包装在一个函数中,就像你试图做的那样。

library(xts)
dat_ts <- xts(dat[,-1],as.Date(dat$Data))
plot_data <-
  function(start,end,stock)
    plot(dat_ts[paste(start,end,sep='/'),stock])

您可以这样称呼它:

plot_data('2012-02-09','2012-02-14','IBOV')

enter image description here

答案 1 :(得分:1)

(我假设您的EWMA_SD252 data.frame&#39; Data列已经Date类。如果它尚未转换它。)

看起来您试图在给定的日期间隔内绘制data.frame的特定列。如果您使用比xyz更具描述性的变量名称,那么其他人将更容易阅读您的代码(以及您在6个月内也是如此!) date0date1column

让我们改写你的功能。如果EWMA_SD252已经是data.frame,那么您不需要将cbind个列列入data.frame。提供数据参数也可以使事情更加灵活。您的所有datas函数都会转换为Dates并调用intervalo_datas,因此我们也应将其包装起来。

intervalo_datas <- function(date0, date1, column_name, data = EWMA_SD252) {
     if (!is.Date(date0)) date0 <- as.Date(date0, "%d/%m/%Y")
     if (!is.Date(date1)) date1 <- as.Date(date1,"%d/%m/%Y")
     cols <- c(1, which(names(data) == column_name))
     return(EWMA_SD252[EWMA_SD252$Data >= x & EWMA_SD252$Data <= y, cols])
} 

现在你应该能够以这种方式获得一个子集

ABEV3 = intervalo_datas("09/02/2012", "17/02/2012", "ABEV3")

并且这样的情节。

plot(ABEV3[, 1], ABEV3[, 2])

如果您还希望子集化功能也可以绘制,只需在返回行之前添加绘图命令(但首先定义子集!)。使用像xts之类的东西作为agstudy推荐会简化事情并在轴标签上更好地处理日期。

答案 2 :(得分:1)

您可以使用ggplot2和reshape2来创建一个自动绘制任意数量的股票的函数:

plot_stocks <- function(data, date1, date2, stocks){
  require(ggplot2)
  require(reshape2)
  date1 <- as.Date(date1, "%d/%m/%Y") 
  date2 <- as.Date(date2, "%d/%m/%Y") 
  data <- data[data$Data > date1 & data$Data < date2,c("Data", stocks)] 
  data <- melt(data, id="Data")
  names(data) <- c("Data", "Stock", "Value")
  ggplot(data, aes(Data, Value, color=Stock)) + geom_line() 
}

绘制一只股票&#34; ABEV3&#34;:

plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", "ABEV3")

enter image description here

绘制三只股票:

plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", c("IBOV", "ABEV3", "AEDU3"))

enter image description here

您可以进一步个性化添加其他地理位置的功能,例如geom_smooth等。

相关问题