Вертикальная гистограмма

Я хотел бы сделать вертикальную гистограмму. В идеале я должен иметь возможность размещать несколько на одном участке в день.

Если бы это можно было объединить с экспериментальной Quantmod chart_Series или какой-либо другой библиотекой, способной рисовать столбцы для временного ряда, это было бы здорово. Пожалуйста, смотрите прикрепленный скриншот. В идеале я мог бы построить что-то вроде этого.

Есть ли какие-либо встроенные или существующие библиотеки, которые могут помочь в этом?

Пример профиля рынка


person Dave    schedule 11.11.2012    source источник


Ответы (3)


Я написал что-то около года назад, чтобы сделать вертикальные гистограммы в базовой графике. Вот он, с примером использования.

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]])
    }

вертикальные гистограммы

person Gregor Thomas    schedule 11.11.2012
comment
Я действительно нашел это полезным и в итоге написал обертку, чтобы использовать его более гибко. Опубликовал на github.com/ozgen92/VerticalHist, надеюсь, вы не возражаете :) - person ozgeneral; 21.03.2018
comment
Спасибо! Я не возражаю, но было бы неплохо иметь крик, либо строку в конце ридми, либо комментарий в коде, говорящий На основе этого ответа на переполнение стека, созданного Грегором Томасом: stackoverflow.com/a/13334294/903061 - person Gregor Thomas; 21.03.2018
comment
Конечно, мне очень жаль, что я не добавил это в первую очередь. Это первый раз, когда я улучшил чужой код, так что никакого плагиата не было, я просто поделился, чтобы другие люди могли использовать plug and play. - person ozgeneral; 21.03.2018

Сюжеты для скрипки могут быть достаточно близки к тому, что вы хотите. Это графики плотности, отраженные по одной оси, как гибрид коробчатой ​​диаграммы и графика плотности. (Намного легче понять на примере, чем по описанию. :-))

Вот простой (несколько уродливый) пример их реализации на ggplot2:

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)

скрипичный график поверх линейного графика временного ряда

Более красивым примером будет:

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

введите здесь описание изображения

Чтобы включить диапазоны вместо или в дополнение к линии, вы должны использовать geom_linerange или geom_pointrange.

person MattBagg    schedule 11.11.2012

Если вы используете сетчатую графику, вы можете создавать повернутые видовые экраны, где хотите, и печатать на повернутом видовом экране. Вам просто нужна функция, которая будет отображать графику сетки в указанном окне просмотра, я бы предложил для этого ggplot2 или, возможно, решетку.

В базовой графике вы можете написать свою собственную функцию для построения повернутой гистограммы (измените функцию plot.histogram или просто напишите свою собственную с нуля, используя rect или другие инструменты). Затем вы можете использовать функцию subplot из пакета TeachingDemos, чтобы разместить график в любом месте на большом графике.

person Greg Snow    schedule 11.11.2012