【问题标题】:Creating a vertical color gradient for a geom_bar plot为 geom_bar 图创建垂直颜色渐变
【发布时间】:2018-06-20 23:16:26
【问题描述】:

我已经搜索和搜索,但我似乎找不到这样做的优雅方法!

我有一个数据集 DataData$x(日期)和 Data$y(从 0 到 1 的数字)组成

我想将它们绘制成条形图:

ggplot(Data) + geom_bar(aes(x = x, y = y, fill = y, stat = "identity")) +
   scale_fill_gradient2(low = "red", high = "green", mid = "yellow", midpoint = 0.90)

结果是这样的

但是,我想在垂直方向上为每个条形设置一个渐变,范围从 0(红色)到 y(绿色取决于 y)。有什么办法可以顺利做到这一点?

我试图看看是否可以将图片作为 hack 强加在图表上,但我不能仅将其强加在条上,除非以超级丑陋的方式。

【问题讨论】:

  • 还在等ggplot包自带的这个功能

标签: r ggplot2 plot colors geom-bar


【解决方案1】:

另一个,不是很漂亮,使用geom_segment 破解。 x 开始和结束位置(xxend)是硬编码的(- 0.4+ 0.4),size 也是。这些数字需要根据 x 值的数量和 y 的范围进行调整。

# some toy data
d <- data.frame(x = 1:3, y = 1:3)

# interpolate values from zero to y and create corresponding number of x values
vals <- lapply(d$y, function(y) seq(0, y, by = 0.01))
y <- unlist(vals)
mid <- rep(d$x, lengths(vals))
d2 <- data.frame(x = mid - 0.4,
                 xend = mid + 0.4,
                 y = y,
                 yend = y)

ggplot(data = d2, aes(x = x, xend = xend, y = y, yend = yend, color = y)) +
  geom_segment(size = 2) +
  scale_color_gradient2(low = "red", mid = "yellow", high = "green", 
                        midpoint = max(d2$y)/2) 


一个有点相关的问题,可能会给你一些其他的想法:How to make gradient color filled timeseries plot in R

【讨论】:

  • 嗨,这非常有用,谢谢。是否可以手动设置颜色范围的限制?例如,我想在某个值(红色)处存在生物压力阈值的情况下显示类似的东西。因此,当我的条达到该阈值时,它们将显示为红色,而不是 Y 的上限。
  • 嗨@A.Benson 如果我理解正确,你可以看看scale_fill_gradientn 和它的values 参数。该文档有点简洁,但在 SO 上有几个不错的帖子。祝你好运!
【解决方案2】:

据我所知不存在,但您可以操纵数据来生成它。

library(ggplot2)

df = data.frame(x=c(1:10),y=runif(10))

prepGradient <- function(x,y,spacing=max(y)/100){
  stopifnot(length(x)==length(y))
  df <- data.frame(x=x,y=y)
  newDf = data.frame(x=NULL,y=NULL,z=NULL)
  for (r in 1:nrow(df)){
    n <- floor(df[r,"y"]/spacing)
    for (s in c(1:n)){
      tmp <- data.frame(x=df[r,"x"],y=spacing,z=s*spacing)
      newDf <- rbind(newDf,tmp)
    }
    tmp <- data.frame(x=df[r,"x"],y=df[r,"y"]%%spacing,z=df[r,"y"])
    newDf <- rbind(newDf,tmp)
  }
  return(newDf)
}

df2 <- prepGradient(df$x,df$y)

ggplot(df2,aes(x=x,y=y,fill=z)) + 
  geom_bar(stat="identity") + 
  scale_fill_gradient2(low="red", high="green", mid="yellow",midpoint=median(df$y))+
  ggtitle('Vertical Gradient Example') +
  theme_minimal()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2019-08-22
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多