2017-03-29 56 views
0

我寫了一個函數,可以生成一個直方圖兩個垂直條,用於指示一個值的範圍。我想修改這個函數,使得指定範圍內的條紋是不同的顏色。R - ggplot直方圖,基於範圍的顏色

繼承人我的功能和快速演示:

require(ggplot2) 
niceHist <- function(data, cutpoint1, cutpoint2, title = "Supply a title, genius") { 
    temp_dat = data.frame(Data = data, Col = 0) 
    temp_dat = temp_dat[! is.na(temp_dat$Data),] 
    temp_dat[temp_dat$Data >= cutpoint1 & temp_dat$Data <= cutpoint2,]$Col = 1 
    my_hist = qplot(data) + 
    geom_histogram(fill = "forestgreen") + 
    geom_vline(xintercept = cutpoint1) + 
    geom_vline(xintercept = cutpoint2) + 
    ggtitle(paste(title)) + 
    theme_minimal() + 
    theme(text = element_text(size = 16), axis.line.y = element_line(color = "black", size = 0.5), axis.line.x = element_line(color = "black", size = 0.5)) 
    my_hist 
} 
u = rnorm(100) 
c1 = mean(u) - sd(u) 
c2 = mean(u) + sd(u) 
niceHist(u, c1, c2) 

我見過similar question,因爲我想保持原來的直方圖的形狀,其接受的解決方案是不是很適合我的需要。我也不希望更改垃圾箱的數量,並且如果可能的話,應用顏色差異,使得直方圖中的單個條紋可以是兩種顏色,如果垂直的黑色線條恰好平分它的話。

*我的主要目標是清楚地顯示在提供的範圍內捕捉了多少分佈,而不改變分佈的形狀。 *因此,一個替代但不太理想的解決方案是簡單地將背景與所提供的範圍相關聯。另外,我需要我的函數來返回一個ggplot對象,因爲它偶爾會使用ggplot語法進一步修改。

UPDATE: 在評論的建議,我一直在使用scale_fill_gradientn嘗試,但這個不起作用:

niceHist <- function(data, cutpoint1, cutpoint2, title = "Supply a title, genius") { 
     temp_dat = data.frame(Data = data, Col = 0) 
     temp_dat = temp_dat[! is.na(temp_dat$Data),] 
     temp_dat[temp_dat$Data >= cutpoint1 & temp_dat$Data <= cutpoint2,]$Col = 1 
     my_hist = qplot(data) + 
     geom_histogram() + 
     scale_fill_gradientn(colours = c("blue", "red", "red", "blue"), values = c(min(data, na.rm = TRUE), cutpoint1, cutpoint2, max(data, na.rm = TRUE))) + 
     geom_vline(xintercept = cutpoint1) + 
     geom_vline(xintercept = cutpoint2) + 
     ggtitle(paste(title)) + 
     theme_minimal() + 
     theme(text = element_text(size = 16), axis.line.y = element_line(color = "black", size = 0.5), axis.line.x = element_line(color = "black", size = 0.5)) 
     my_hist 
    } 
+1

你看過scale_fill_gradient – user2510479

回答

0

我的解決辦法是建立計data.frame並添加係數來表示bin的區域。例如:

df <- ggplot_build(niceHist(u,c1,c2))$data[[1]] #recreate the count df 
require(dplyr) 
df <- df %>% mutate(col=cut(x,c(min(x)-0.001,c1,c2,max(x)+0.001))) 
ggplot(df,aes(x,count))+ geom_col(aes(fill=col)) + geom_vline(xintercept = c(c1,c2))