【问题标题】:Using a Function to plot in R使用函数在 R 中绘图
【发布时间】:2014-07-10 19:17:57
【问题描述】:

我有一个名为 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 = 数据("09/02/2012","17/02/2012","ABEV3")

【问题讨论】:

    标签: r function plot dataframe


    【解决方案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() 
    }
    

    绘制一只股票“ABEV3”:

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

    绘制三只股票:

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

    您可以进一步个性化您的功能,添加其他几何图形,例如 geom_smooth 等。

    【讨论】:

      【解决方案2】:

      我认为你应该使用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')
      

      【讨论】:

        【解决方案3】:

        (我假设您的 EWMA_SD252 data.frame 的 Data 列已经是 Date 类。如果还没有,请转换它。)

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

        让我们重写你的函数。如果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])
        

        如果您希望子集函数也绘制,只需在返回行之前添加 plot 命令(但首先定义子集!)。按照 agstudy 的建议使用 xts 之类的东西会简化事情并更好地处理轴标签上的日期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 2019-04-28
          • 2014-11-21
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          相关资源
          最近更新 更多