2012-11-11 24 views
6

Ich möchte ein vertikales Histogramm machen. Idealerweise sollte ich in der Lage sein, mehrere auf einer einzelnen Handlung pro Tag zu setzen.Vertikales Histogramm

Wenn dies mit quantmod experimental chart_Series oder einer anderen Bibliothek kombiniert werden könnte, die Balken für eine Zeitreihe zeichnen könnte, wäre das großartig. Bitte sehen Sie sich den beigefügten Screenshot an. Im Idealfall könnte ich so etwas planen.

Gibt es eingebaute oder vorhandene Bibliotheken, die dabei helfen können?

Market Profile Example

Antwort

1

Wenn Sie Rastergrafik verwenden, dann können Sie gedreht Ansichtsfenster erstellen Überall dort, wo Sie sie und die Handlung auf das gedrehte Bildfenster soll. Sie brauchen nur eine Funktion, die mit Rastergrafiken in ein spezifiziertes Ansichtsfenster plottet, ich würde ggplot2 oder möglicherweise ein Gitter dafür vorschlagen.

In Basisgrafiken könnten Sie Ihre eigene Funktion schreiben, um das gedrehte Histogramm zu plotten (modifizieren Sie die Funktion plot.histogram oder schreiben Sie einfach Ihre eigenen mit rect oder anderen Werkzeugen). Dann können Sie die Funktion subplot aus dem TeachingDemos-Paket verwenden, um das Diagramm an einer größeren Stelle an einer beliebigen Stelle anzuordnen.

3

Violin-Plots könnten nah genug an dem sein, was Sie wollen. Sie sind Dichte-Plots, die durch eine Achse gespiegelt wurden, wie ein Hybrid aus Boxplot und Dichtediagramm. (Viel einfacher zu verstehen mit gutem Beispiel als Beschreibung :-).)

Hier ist ein einfaches (etwas hässlich) Beispiel für die ggplot2 Implementierung von ihnen:

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

Ein schönen Beispiel wäre sein:

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

Um Bereiche anstelle von oder zusätzlich zu der Linie einzubeziehen, würden Sie geom_linerange oder geom_pointrange verwenden.

9

Ich schrieb etwas vor einem Jahr, um vertikale Histogramme in Basisgrafiken zu tun. Hier ist es, mit einem Anwendungsbeispiel.

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