【问题标题】:How to fill histogram with color gradient?如何用颜色渐变填充直方图?
【发布时间】:2017-03-10 02:46:06
【问题描述】:

我有一个简单的问题。如何用固定的binwidth 绘制直方图ggplot2 并填充彩虹色(或任何其他调色板)?

假设我有这样的数据:

myData <- abs(rnorm(1000))

我想绘制直方图,例如使用binwidth=.1。然而,这将导致不同数量的垃圾箱,具体取决于数据:

ggplot() + geom_histogram(aes(x = myData), binwidth=.1) 

如果我知道垃圾箱的数量(例如n=15),我会使用类似:

ggplot() + geom_histogram(aes(x = myData), binwidth=.1, fill=rainbow(n))

但是随着垃圾箱数量的变化,我有点卡在这个简单的问题上。

【问题讨论】:

  • 所以,如果我理解正确的话,您希望直方图的每个 bin 都根据彩虹渐变进行不同的着色?
  • 是的,这正是我想要的
  • @user20650 我看到了这个答案,但是那里的垃圾箱数量是固定的,所以它不能解决我的问题。
  • @yup 同意...
  • 这似乎有效...n &lt;- round(((max(myData)-min(myData))/.1)+1)

标签: r ggplot2 histogram color-palette


【解决方案1】:

如果您真的想要灵活的垃圾箱数量,这是我的小解决方法:

library(ggplot2)

gg_b <- ggplot_build(
  ggplot() + geom_histogram(aes(x = myData), binwidth=.1)
)

nu_bins <- dim(gg_b$data[[1]])[1]

ggplot() + geom_histogram(aes(x = myData), binwidth=.1, fill = rainbow(nu_bins))

【讨论】:

  • 是的,这正是我所需要的。我只是在想(并希望)有一些更直接的方法可以做到这一点:)谢谢!
【解决方案2】:

如果 binwidth 是固定的,这里有一个替代解决方案,它使用内部函数 ggplot2:::bin_breaks_width() 在创建图表之前获取 bin 的数量。这仍然是一种解决方法,但避免在 the other solution 中调用 geom_histogram() 两次:

# create sample data
set.seed(1L)
myData <- abs(rnorm(1000))
binwidth <- 0.1

# create plot    
library(ggplot2)   # CRAN version 2.2.1 used
n_bins <- length(ggplot2:::bin_breaks_width(range(myData), width = binwidth)$breaks) - 1L
ggplot() + geom_histogram(aes(x = myData), binwidth = binwidth, fill = rainbow(n_bins)) 


作为第三种选择,聚合可以在ggplot2 之外完成。然后,可以使用geom_col() 代替geom_histogram()

# start binning on multiple of binwidth
start_bin <- binwidth * floor(min(myData) / binwidth)
# compute breaks and bin the data
breaks <- seq(start_bin, max(myData) + binwidth, by = binwidth)
myData2 <- cut(sort(myData), breaks = breaks, by = binwidth)

ggplot() + geom_col(aes(x = head(breaks, -1L), 
                        y = as.integer(table(myData2)), 
                        fill = levels(myData2))) + 
  ylab("count") + xlab("myData")

请注意,breaks 绘制在 x 轴上,而不是 levels(myData2),以保持 x 轴连续。否则将绘制每个因子标签,这会使 x 轴混乱。另请注意,使用内置的ggplot2 调色板而不是rainbow()

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2019-08-22
    • 2014-01-31
    • 2015-04-04
    • 1970-01-01
    • 2015-12-21
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多