[英]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的特定列。 如果您使用比x
, y
和z
更具描述性的變量名,例如date0
, date1
, column
,那么其他人將更容易閱讀您的代碼(並且您也將在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.