2016-10-27 4 views
2

У меня есть простая проблема. Как построить гистограмму с ggplot2 с фиксированным binwidth и наполнен цветами радуги (или любой другой палитрой)?Как заполнить гистограмму цветным градиентом?

Допустим, у меня есть данные, как, что:

myData <- abs(rnorm(1000)) 

Я хочу построить гистограмму, используя, например, binwidth=.1. Это, однако, будет вызывать различное количество бункеров, в зависимости от данных:

ggplot() + geom_histogram(aes(x = myData), binwidth=.1) 

enter image description here

Если бы я знал, что количество контейнеров (например, n=15) Я хотел бы использовать что-то вроде:

ggplot() + geom_histogram(aes(x = myData), binwidth=.1, fill=rainbow(n)) 

Но с меняющимся количеством ящиков Я как бы застрял в этой простой проблеме.

+0

Итак, если я правильно вас понимаю, вы хотите, чтобы каждый бит гистограммы был по-разному окрашен в соответствии с градиентом радуги? –

+0

Да, это именно то, что я хочу – Art

+0

@ user20650 Я видел этот ответ, но там количество ящиков исправлено, поэтому оно не решает мою проблему. – Art

ответ

4

Если вы действительно хотите, количество бункеров гибкой, вот мой маленький обходной путь:

library(ggplot2) 

gg_b <- ggplot_build(
    ggplot() + geom_histogram(aes(x = myData), binwidth=.1) 
) 

nu_bins <- dim(gg_b$data[[1]])[1] 

ggplot() + geom_histogram(aes(x = myData), binwidth=.1, fill = rainbow(nu_bins)) 

enter image description here

+0

Да, это это то, что мне нужно. Я просто думал (и надеялся), что есть еще более простой способ сделать это :) Спасибо! – Art

0

В случае binwidth фиксируется, здесь альтернативное решение, которое использует внутреннюю функцию ggplot2:::bin_breaks_width(), чтобы получить количество ящиков до создание графика. Это еще обходной путь, но избегает называть geom_histogram() два раза в the other solution:

# create sample data 
set.seed(1L) 
myData <- abs(rnorm(1000)) 
binwidth <- 0.1 

# create plot  
library(ggplot2) # CRAN version 2.2.1 used 
n_bins <- length(ggplot2:::bin_breaks_width(range(myData), width = binwidth)$breaks) - 1L 
ggplot() + geom_histogram(aes(x = myData), binwidth = binwidth, fill = rainbow(n_bins)) 

enter image description here


В качестве третьей альтернативы, агрегация может быть сделано за пределами ggplot2. Затем geom_col() кулачковый быть использован вместо geom_histogram():

# start binning on multiple of binwidth 
start_bin <- binwidth * floor(min(myData)/binwidth) 
# compute breaks and bin the data 
breaks <- seq(start_bin, max(myData) + binwidth, by = binwidth) 
myData2 <- cut(sort(myData), breaks = breaks, by = binwidth) 

ggplot() + geom_col(aes(x = head(breaks, -1L), 
         y = as.integer(table(myData2)), 
         fill = levels(myData2))) + 
    ylab("count") + xlab("myData") 

enter image description here

Обратите внимание, что breaks нанесена на оси х, а не levels(myData2) держать ось х непрерывно. В противном случае будет отображаться каждая метка фактора, которая загромождает ось x. Также обратите внимание, что вместо rainbow() используется встроенная цветовая палитра ggplot2.

Смежные вопросы