2015-02-04 16 views
6

Vorrei creare un istogramma in cui il colore di riempimento cambia in base all'estremità inferiore del raccoglitore. Non voglio un riempimento manual. Questo answer sembra promettente, ma non è stato possibile eseguirne il passaggio a un istogramma e uno schema a due valori (non a gradiente). Credo che la soluzione potrebbe essere qualche logica ifelse all'interno di geom_histogram(fill=) ma non so come accedere al valore iniziale del cestino.Colore di riempimento condizionale istogramma

Ad esempio, nell'istogramma di seguito, vorrei colorare i raccoglitori delle entrate oltre $ 100.000 in rosso per mostrare i clienti ad alto reddito.

library(ggplot2) 
library(scales) 

n <- 10000 
cust <- data.frame(cust_id=1:n,cust_rev <- rexp(n,.00001)) 

# I want to use a log scale for my tick marks and bin breaks 
powers <- function(base,exp) sapply(1:exp, function(exp) base^exp) 

ggplot(cust, aes(cust_rev)) + 
    geom_histogram(color="black",fill="light blue", binwidth=1/3) + 
    scale_x_log10(labels=comma, breaks=powers(10,8)) + 
    scale_y_continuous(labels=comma) + 
    xlab("Customer Revenue") + ylab("Number of Customers") + 
    ggtitle("Distribution of Customer Value") 

enter image description here

Inoltre, ho tentato un workaround con un secondo geom_histogram(), ma senza successo.

ggplot(cust, aes(x=cust_rev)) + 
    geom_histogram(color="black",fill="light blue", binwidth=1/3) + 
    geom_histogram(data=subset(cust,cust_rev>100000), 
       color="black",fill="red", binwidth=1/3) + 
    scale_x_log10(labels=comma, breaks=powers(10,8)) + 
    scale_y_continuous(labels=comma) + 
    xlab("Customer Revenue ($)") + ylab("Number of Customers") + 
    ggtitle("Distribution of Customer Value") 
# Error in data.frame(x = c(45291.1377418786, 52770.7004919648, 15748.975193128, 
# : arguments imply differing number of rows: 10000, 3568 

risposta

11

Sarebbe più semplice per aggiungere solo un'altra colonna con la condizione e aggiornare il aes per includere il gruppo di riempimento.

cust$high_rev <- as.factor((cust[,2]>100000)*1) 

ggplot(cust, aes(cust_rev, fill=high_rev)) + 
    geom_histogram(color="black", binwidth=1/3) + 
    scale_x_log10(labels=comma, breaks=powers(10,8)) + 
    scale_y_continuous(labels=comma) + 
    xlab("Customer Revenue") + ylab("Number of Customers") + 
    ggtitle("Distribution of Customer Value") 

enter image description here

Se hai il tuo cuore su alcuni colori specifici è possibile utilizzare la funzione scale_fill_manual. Ecco un esempio con alcuni divertenti colori vivaci.

ggplot(cust, aes(cust_rev, fill=high_rev)) + 
    geom_histogram(color="black", binwidth=1/3) + 
    scale_x_log10(labels=comma, breaks=powers(10,8)) + 
    scale_y_continuous(labels=comma) + 
    scale_fill_manual(values = c("green", "purple")) + 
    xlab("Customer Revenue") + ylab("Number of Customers") + 
    ggtitle("Distribution of Customer Value") 

enter image description here

+0

accettate per l'uso di 'scale_fill_manual()'. Tuttavia, come suggerito da ziggystar (+1), ho saltato l'aggiunta di una colonna al df e ho passato direttamente la condizione al aes (fill =)). Inoltre, ho aggiunto 'guide (fill = FALSE)' al grafico per sopprimere la legenda. – C8H10N4O2

3

Che ne dici di questo?

ggplot(cust, aes(cust_rev)) + 
    geom_histogram(aes(fill=cust_rev > 100000),binwidth=1/3) + 
    scale_x_log10() 

o equivalentemente

ggplot(cust, aes(x=cust_rev,fill=cust_rev > 100000)) + 
    geom_histogram(binwidth=1/3) + 
    scale_x_log10() 
Problemi correlati