2012-11-11 14 views
6

Chciałbym zrobić histogram pionowy. Idealnie powinienem być w stanie umieścić wiele na jednej działce dziennie.Histogram pionowy

Jeśli można to połączyć z eksperymentalną techniką quantmod chart_Series lub inną biblioteką zdolną do rysowania taktów dla szeregu czasowego, który byłby świetny. Zobacz załączony zrzut ekranu. Idealnie mógłbym coś takiego zaprojektować.

Czy są jakieś wbudowane lub istniejące biblioteki, które mogą pomóc w tym?

Market Profile Example

Odpowiedz

1

Jeśli używasz grafiki siatki następnie można utworzyć obróconych rzutnie gdziekolwiek je i działki do obróconego rzutni chcą. Potrzebujesz tylko funkcji, która będzie rysowała za pomocą grafiki siatki do określonej rzutni, sugerowałbym dla niej ggplot2 lub ewentualnie kratę.

W podstawowej grafice można napisać własną funkcję rysowania obróconego histogramu (zmodyfikować funkcję plot.histogram lub po prostu napisać własną od podstaw, używając rect lub innych narzędzi). Następnie możesz użyć funkcji subplot z pakietu TeachingDemos, aby umieścić fabułę w dowolnym miejscu na większej powierzchni.

3

Fabuła skrzypiec może być wystarczająco bliska. Są to wykresy gęstości, które zostały odzwierciedlone przez jedną oś, jak hybryda pudełka i wykres gęstości. (Znacznie łatwiejsze do zrozumienia przykładem niż opisem :-)).

Oto prosty (nieco brzydki) przykładem realizacji ggplot2 z nich:

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

ładniejszą przykładem być:

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

Aby uwzględnić zakresy zamiast lub oprócz linii, należy użyć wartości geom_linerange lub geom_pointrange.

9

Napisałem coś około roku temu, aby zrobić pionowe histogramy w podstawowej grafice. Oto jest, z przykładem użycia.

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