2016-10-27 7 views
2

Ich habe ein einfaches Problem. Wie man Histogramm mit ggplot2 mit örtlich festgelegtem binwidth plant und mit Regenbogenfarben (oder irgendeiner anderen Palette) füllte?Wie füllt man ein Histogramm mit Farbverlauf?

Können sagen, ich habe eine Daten wie folgt aus:

myData <- abs(rnorm(1000)) 

Ich möchte Histogramm darstellen, zum Beispiel unter Verwendung von binwidth=.1. Das wird jedoch unterschiedliche Anzahl von Behältern verursachen, abhängig von Daten:

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

enter image description here

Wenn ich Anzahl der Bins wusste (zB n=15) ich so etwas wie verwenden würde:

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

Aber mit wechselnder Anzahl von Behältern bin ich irgendwie auf diesem einfachen Problem fest.

+0

Also, wenn ich Sie richtig verstehe, wollen Sie jedes Fach des Histogramms entsprechend einem Regenbogengradienten unterschiedlich gefärbt werden? –

+0

Ja, das ist genau das, was ich will – Art

+0

@ user20650 Ich sah diese Antwort, aber da drüben ist die Anzahl der Bins behoben, so dass es nicht mein Problem löst. – Art

Antwort

4

Wenn Sie wirklich die Anzahl der Bins flexibel wollen, hier ist meine kleine Abhilfe:

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

Ja, das ist genau das, was ich brauche. Ich habe nur gedacht (und gehofft), dass es eine einfachere Methode gibt, das zu tun :) Danke! – Art

0

Bei der binwidth fixiert ist, ist hier eine alternative Lösung, die die interne Funktion verwendet ggplot2:::bin_breaks_width(), um die Anzahl der Bins vor Erstellen der Grafik zu erhalten. Es ist immer noch eine Abhilfe, sondern vermeidet geom_histogram() doppelt so in the other solution zu nennen:

# 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


Als dritte Alternative kann die Aggregation außerhalb von ggplot2 erfolgen. Dann werden geom_col() Nocken statt geom_histogram() verwendet:

# 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

Beachten Sie, dass breaks auf der x-Achse aufgetragen wird statt levels(myData2) die x-Achse kontinuierlich zu halten. Andernfalls würde jedes Faktoretikett geplottet werden, das die x-Achse durcheinander bringen würde. Beachten Sie auch, dass anstelle der rainbow() die integrierte Farbpalette ggplot2 verwendet wird.

Verwandte Themen