2012-11-11 27 views
6

Tôi muốn tạo biểu đồ dọc. Lý tưởng nhất là tôi có thể đặt nhiều trên một ô duy nhất mỗi ngày.Biểu đồ dọc

Nếu điều này có thể được kết hợp với biểu đồ thử nghiệm quantmod hoặc một số thư viện khác có khả năng vẽ thanh cho chuỗi thời gian sẽ tuyệt vời. Vui lòng xem ảnh chụp màn hình đính kèm. Lý tưởng nhất tôi có thể vẽ một cái gì đó như thế này.

Có bất kỳ thứ gì được xây dựng trong hoặc các thư viện hiện có có thể trợ giúp về điều này không?

Market Profile Example

Trả lời

1

Nếu bạn sử dụng đồ họa lưới sau đó bạn có thể tạo khung nhìn xoay bất cứ nơi nào bạn muốn họ và âm mưu viewport xoay. Bạn chỉ cần một chức năng mà sẽ âm mưu bằng cách sử dụng đồ họa lưới vào một khung nhìn quy định, tôi sẽ đề nghị ggplot2 hoặc có thể mạng cho việc này.

Trong đồ họa cơ sở, bạn có thể viết hàm của riêng mình để vẽ biểu đồ xoay (sửa đổi hàm plot.histogram hoặc chỉ viết từ đầu bằng cách sử dụng rect hoặc các công cụ khác). Sau đó, bạn có thể sử dụng hàm subplot từ gói TeachingDemos để đặt cốt truyện bất cứ nơi nào bạn muốn trên một ô lớn hơn.

3

Tông lô có thể đủ gần với những gì bạn muốn. Chúng là các ô mật độ được nhân đôi qua một trục, giống như một ô ghép của một ô mẫu và một ô mật độ. (Dễ dàng hơn để hiểu bằng ví dụ hơn là mô tả :-).)

Đây là một đơn giản (hơi xấu xí) ví dụ về việc thực hiện ggplot2 trong số họ:

library(ggplot2) 
library(lubridate) 

data(economics) #sample dataset 

# calculate year to group by using lubridate's year function 
economics$year<-year(economics$date) 

# get a subset 
subset<-economics[economics$year>2003&economics$year<2007,]  

ggplot(subset,aes(x=date,y=unemploy))+ 
    geom_line()+geom_violin(aes(group=year),alpha=0.5) 

violin plot over a line plot of a time series

Một ví dụ đẹp sẽ là:

ggplot(subset,aes(x=date,y=unemploy))+ 
    geom_violin(aes(group=year,colour=year,fill=year),alpha=0.5, 
    kernel="rectangular")+ # passes to stat_density, makes violin rectangular 
    geom_line(size=1.5)+  # make the line (wider than normal) 
    xlab("Year")+    # label one axis 
    ylab("Unemployment")+  # label the other 
    theme_bw()+      # make white background on plot 
    theme(legend.position = "none") # suppress legend 

enter image description here

Để bao gồm các dải thay vì hoặc ngoài dòng, bạn sẽ sử dụng geom_linerange hoặc geom_pointrange.

9

Tôi đã viết một cái gì đó một năm hoặc lâu hơn trước đây để làm biểu đồ dọc trong đồ họa cơ sở. Đây là, với một ví dụ sử dụng.

VerticalHist <- function(x, xscale = NULL, xwidth, hist, 
         fillCol = "gray80", lineCol = "gray40") { 
    ## x (required) is the x position to draw the histogram 
    ## xscale (optional) is the "height" of the tallest bar (horizontally), 
    ## it has sensible default behavior 
    ## xwidth (required) is the horizontal spacing between histograms 
    ## hist (required) is an object of type "histogram" 
    ## (or a list/df with $breaks and $density) 
    ## fillCol and lineCol... exactly what you think. 
    binWidth <- hist$breaks[2] - hist$breaks[1] 
    if (is.null(xscale)) xscale <- xwidth * 0.90/max(hist$density) 
    n <- length(hist$density) 
    x.l <- rep(x, n) 
    x.r <- x.l + hist$density * xscale 
    y.b <- hist$breaks[1:n] 
    y.t <- hist$breaks[2:(n + 1)] 

    rect(xleft = x.l, ybottom = y.b, xright = x.r, ytop = y.t, 
     col = fillCol, border = lineCol) 
} 



## Usage example 
require(plyr) ## Just needed for the round_any() in this example 
n <- 1000 
numberOfHists <- 4 
data <- data.frame(ReleaseDOY = rnorm(n, 110, 20), 
        bin = as.factor(rep(c(1, 2, 3, 4), n/4))) 
binWidth <- 1 
binStarts <- c(1, 2, 3, 4) 
binMids <- binStarts + binWidth/2 
axisCol <- "gray80" 

## Data handling 
DOYrange <- range(data$ReleaseDOY) 
DOYrange <- c(round_any(DOYrange[1], 15, floor), 
         round_any(DOYrange[2], 15, ceiling)) 

## Get the histogram obects 
histList <- with(data, tapply(ReleaseDOY, bin, hist, plot = FALSE, 
    breaks = seq(DOYrange[1], DOYrange[2], by = 5))) 
DOYmean <- with(data, tapply(ReleaseDOY, bin, mean)) 

## Plotting 
par(mar = c(5, 5, 1, 1) + .1) 
plot(c(0, 5), DOYrange, type = "n", 
    ann = FALSE, axes = FALSE, xaxs = "i", yaxs = "i") 

axis(1, cex.axis = 1.2, col = axisCol) 
mtext(side = 1, outer = F, line = 3, "Length at tagging (mm)", 
     cex = 1.2) 
axis(2, cex.axis = 1.2, las = 1, line = -.7, col = "white", 
    at = c(75, 107, 138, 169), 
    labels = c("March", "April", "May", "June"), tck = 0) 
mtext(side = 2, outer = F, line = 3.5, "Date tagged", cex = 1.2) 
box(bty = "L", col = axisCol) 

## Gridlines 
abline(h = c(60, 92, 123, 154, 184), col = "gray80") 

biggestDensity <- max(unlist(lapply(histList, function(h){max(h[[4]])}))) 
xscale <- binWidth * .9/biggestDensity 

## Plot the histograms 
for (lengthBin in 1:numberOfHists) { 
    VerticalHist(binStarts[lengthBin], xscale = xscale, 
         xwidth = binWidth, histList[[lengthBin]]) 
    } 

verticalhistograms

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