我写了一个函数,它产生一个直方图,两个垂直条表示一系列值。我想修改此函数,以便指定范围内的条形是不同的颜色。
继承人的功能和快速演示:
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语法进一步修改。
更新: 在评论的建议中,我尝试过使用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
}
答案 0 :(得分: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))