2015-02-04 35 views
6

Doldurma renginin, bölmenin alt ucuna bağlı olarak değiştiği bir histogram yapmak istiyorum. manual doldurmak istemiyorum. Bu answer umut verici görünüyor, ancak başarılı bir histogram ve iki değer (degrade olmayan) renk şemasına geçiş yapamıyorum. Çözümün geom_histogram(fill=) içinde ifelse mantığı olabileceğine inanıyorum, ancak bin başlangıç ​​değerine nasıl erişeceğimi bilmiyorum. Örneğin, aşağıdaki histogramda, yüksek gelirli müşterileri göstermek için 100.000 $ 'ın üzerinde gelir kutularını renklendirmek istiyorum. Histogram koşullu dolgu rengi

enter image description here

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") 

Ayrıca, ikinci bir geom_histogram() ile bir workaround çalıştı, ancak başarısız oldu.

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 

cevap

11

Sadece koşulu ile başka bir sütun eklemek ve dolgu grubunu içerecek şekilde aes güncellemenin en kolay olurdu. kalbinin bazı özel renklere kurduysanız

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

Eğer scale_fill_manual işlevini kullanabilirsiniz. İşte bazı eğlenceli parlak renkler ile bir örnek.

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

') (scale_fill_manual 'kullanımı için kabul edildi. Bununla birlikte, aşağıda ziggystar (+1) önerildiği gibi, df'ye bir sütun eklemeyi ve koşulu doğrudan aes'e (fill =)) aktarmayı atladım. Ayrıca, efsaneyi baskılamak için komploya '' guides '' (fill = FALSE) 'ekledim. – C8H10N4O2

3

Bu nasıl?

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

veya eşdeğer

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