2015-08-29 24 views
5

Tôi muốn vẽ một đường kẻ có nhiều màu và các màu được dựa trên giá trị tương ứng trong một hệ số. Ví dụ, một chuỗi thời gian giá đóng hàng ngày, nơi những ngày mà nó tăng lên nhiều hơn một lượng nhất định là màu xanh, và những ngày nó đã được thực hiện bởi rất nhiều là màu đỏ, và những ngày khác nó ở nhàm chán màu đen.Chuỗi thời gian hàng loạt sử dụng các màu khác nhau dựa trên hệ số

Dữ liệu của tôi nằm trong đối tượng xts (với yếu tố được đặt trong đó với as.numeric(myfactor)) và tôi muốn sử dụng hàm lượng tử chartSeries hoặc chart_Series. Nhưng nếu điều đó là không thể thì một cái gì đó sử dụng plot sẽ là đủ.

Một số dữ liệu mẫu:

library(xts) 
x = xts(data.frame(v=(rnorm(50)+10)*10, type=floor(runif(50)*4)), 
    order.by=as.Date("2001-01-01")+1:50) 

Và tôi có thể vẽ nó như thế này:

library(quantmod) 
chartSeries(x$v) 
addTA(x$type, type='p') 

nào trông như thế này: plot using chartSeries

Tức là Tôi cảm thấy sẽ dễ dàng hơn khi so khớp thông tin trong biểu đồ dưới cùng với biểu đồ hàng đầu nếu các đoạn đường màu được sử dụng.

+1

Bạn nên đăng một số dữ liệu.Tôi đoán bạn không muốn những gì hầu hết mọi người sẽ gọi là "đường" nhưng thay vì muốn "phân đoạn" màu. –

+0

@BondedDust Tôi đã thêm một số dữ liệu thử nghiệm. 'phân đoạn' có thể là những gì tôi muốn, mặc dù nó có vẻ khá thấp (không hỗ trợ cho dấu thời gian trên trục x?) –

Trả lời

1

Mã này bắt đầu dưới dạng mod nhỏ của mã ví dụ trên ?segments và đó là lý do tại sao tiêu đề của biểu đồ có vẻ lạ, nhưng tôi đã quyết định vẫn để nguyên. Logic là các thuật ngữ bên trong "[.]" Sẽ "chọn" màu dựa trên sự khác biệt giữa các giá trị liên tiếp được tạo thành sự khác biệt giữa tail(y,-1)head(y,-1), với mặc định là "đen" và các ngưỡng là 1 trong trường hợp này , nhưng điều đó có thể dễ dàng được thay đổi:

set.seed(123) 
x <- 1:12; y <- rnorm(12) 
plot(x, y, main = "arrows(.) and segments(.)") 

s <- seq(length(x)-1) 
arrows(x[s], y[s], x[s+1], y[s+1], 
     col= c("black", "red", "blue")[1+       # default=1 
             (tail(y,-1)-head(y,-1) < -1) + # big down (1+1) 
            2*(tail(y,-1)-head(y,-1) > 1) ]) # big up (1+2) 

Nếu bạn chỉ muốn đoạn thẳng nhàm chán, bạn có thể sử dụng chức năng segments hơn arrows.

enter image description here

Tôi nhận ra trên đọc câu hỏi một lần nữa rằng anh nói anh đã có một biến tố trong XTS-đối tượng của bạn, mặc dù hiểu biết của tôi là XTS-đối tượng có thể không có khả năng giữ cột yếu tố kiểu , vì chúng là các công thức của lớp sở thú và coredata là một ma trận R (do đó không có thuộc tính mức độ). Nhưng có lẽ các anh chàng lượng tử có một giải pháp cho điều đó? Vì vậy, đó sẽ là một lý do khác để bạn đăng một số dữ liệu, và XIN sử dụng dput để trình bày đối tượng. Xây dựng xts-objects từ đầu ra console là một rắc rối thực sự.

2

Vì vậy, đây là giải pháp ggplot. Nó có liên quan nhiều hơn một chút, nhưng cung cấp các tùy chọn định dạng phức tạp hơn.

library(quantmod) 
sp500 <- getSymbols("^GSPC", from="2015-01-01", auto.assign=FALSE) 
sp500 <- Cl(sp500)       # extract close 
sp500 <- merge(sp500, dailyReturn(sp500)) # add daily returns 
sp500 <- merge(lag(Cl(sp500),1), sp500) # merge with close lagged by 1 day 

names(sp500) <- c("ymin", "ymax", "return") 
library(ggplot2) 
library(scales) 
df <- with(sp500, 
      data.frame(xmin=c(lag(index(sp500),1)), 
         xmax=index(sp500), 
         ymin, ymax, return)) 
df$status <- with(df,ifelse(return>0.01,"up",ifelse(return< -0.01,"down","neutral"))) 
ggplot(df) + 
    geom_segment(aes(x=xmin, xend=xmax, y=ymin, yend=ymax, color=status)) + 
    scale_color_manual(values=c(up="green", down="red", neutral="grey50"), 
        breaks=c("up","down"), 
        labels=c("Gain > 1%", "Loss > 1%")) + 
    scale_x_date(breaks=date_breaks("months"), labels=date_format("%b"))+ 
    labs(x=NULL, y="Closing Price", title="S&P 500") + 
    theme(panel.background =element_rect(fill="black"), 
     panel.grid = element_blank()) 

Như với câu trả lời khác ý tưởng cơ bản là để vẽ các đoạn mã hóa bằng màu dựa trên tầm quan trọng của Lãi/lỗ. Vì vậy, chúng tôi bắt đầu bằng cách trích xuất giá đóng, thêm cột trả về và sau đó thêm một cột giá đóng khác bị trễ 1 ngày. Sau đó, chúng tôi tạo ra một data.frame từ này với hai cột ngày tháng, cũng bị trễ 1 ngày. Sau đó, chúng tôi thêm một cột (status) để cho biết nếu tỷ lệ tăng/giảm> 1%. Sau đó, chúng tôi sử dụng điều này để lái xe geom_segment(...), mã màu bằng status. Trong cuộc gọi scale_color_manual(...), chúng tôi đặt màu thành đỏ và xanh lục và loại trừ màu trung tính khỏi chú giải. Phần còn lại là tất cả định dạng.

Các vấn đề liên quan