按渐变给 geom_histogram 着色

Coloring a geom_histogram by gradient

我正在尝试绘制一个 geom_histogram,其中条形由渐变着色。

这就是我想要做的:

library(ggplot2)
set.seed(1)
df <- data.frame(id=paste("ID",1:1000,sep="."),val=rnorm(1000),stringsAsFactors=F)
ggplot(df,aes_string(x="val",y="..count..+1",fill="val"))+geom_histogram(binwidth=1,pad=TRUE)+scale_y_log10()+scale_fill_gradient2("val",low="darkblue",high="darkred")

但是得到:

知道如何通过定义的渐变为其着色吗?

不确定是否可以按 val 填充,因为直方图的每个条形代表一组点。

但是,您可以使用 cut 按分类箱进行填充。例如:

ggplot(df, aes(val, fill = cut(val, 100))) +
  geom_histogram(show.legend = FALSE)

仅供参考。

如果我想要手动选择渐变的颜色,我的建议是:

数据:

library(ggplot2)
set.seed(1)
df <- data.frame(id=paste("ID",1:1000,sep="."),val=rnorm(1000),stringsAsFactors=F)

颜色:

bins <- 10
cols <- c("darkblue","darkred")
colGradient <- colorRampPalette(cols)
cut.cols <- colGradient(bins)
cuts <- cut(df$val,bins)
names(cuts) <- sapply(cuts,function(t) cut.cols[which(as.character(t) == levels(cuts))])

剧情:

ggplot(df,aes(val,fill=cut(val,bins))) + 
    geom_histogram(show.legend=FALSE) +
    scale_color_manual(values=cut.cols,labels=levels(cuts)) +
    scale_fill_manual(values=cut.cols,labels=levels(cuts))

不是手动分箱,另一种选择是通过映射 ..x..(或 factor(..x..) 在离散比例的情况下)或 after_stat(x) 关于 fill 美学。

手动计算 bin 的一个问题是,我们最终得到每个 bin 的多个组,必须为其计算计数(即使计数在大多数情况下为零)并且堆叠在每个 bin 的顶部其他在直方图中。特别是,如果像 中所示那样向直方图中添加计数标签,就会出现问题,因为在这种情况下,每个 bin 都有多个标签。

library(ggplot2)

set.seed(1)

df <- data.frame(id = paste("ID", 1:1000, sep = "."), val = rnorm(1000), stringsAsFactors = F)

ggplot(df, aes(x = val, y = ..count.. + 1, fill = ..x..)) +
  geom_histogram(binwidth = .1, pad = TRUE) +
  scale_y_log10() +
  scale_fill_gradient2(name = "val", low = "darkblue", high = "darkred")
#> Warning: Duplicated aesthetics after name standardisation: pad