簡體   English   中英

使用函數在R中繪圖

[英]Using a Function to plot in R

我有一個名為EWMA_SD252 3561 obs的數據EWMA_SD252 的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 =數據(“ 2012年9月2日”,“ 2012年2月17日”,“ ABEV3”)

我認為您應該使用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')

在此處輸入圖片說明

(我假設您的EWMA_SD252 data.frame的Data列已為Date類。如果尚未轉換,則將其轉換。)

看起來您試圖在給定的日期間隔內繪制data.frame的特定列。 如果您使用比xyz更具描述性的變量名,例如date0date1column ,那么其他人將更容易閱讀您的代碼(並且您也將在6個月內!)。

讓我們重寫您的函數。 如果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命令(但首先定義子集!)。 建議使用xts類的方法來簡化操作,並更好地處理軸標簽上的日期。

您可以使用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等,進一步個性化您的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM