【问题标题】:R - ggplot histogram with colors based on rangeR - ggplot 直方图,颜色基于范围
【发布时间】:2017-03-29 17:43:34
【问题描述】:

我编写了一个函数,它可以生成一个直方图,两个竖线表示值的范围。我想修改这个函数,使指定范围内的条形变为不同的颜色。

这是我的功能和快速演示:

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
    }

【问题讨论】:

  • 你看过 scale_fill_gradient

标签: r ggplot2 colors histogram


【解决方案1】:

我的解决方案是创建 count 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)) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2021-08-21
    • 2019-08-22
    • 2019-07-07
    • 1970-01-01
    • 2021-08-31
    • 2012-01-18
    相关资源
    最近更新 更多