ggplot2中的渐变填充

7

假设有以下情节。

library(ggplot2)
n <- 1169
df22 <- data.frame(x = 1:n, val = seq(0, 0.5, length.out = n), type = 1)

ggplot(df22, aes(x = x, y = val)) +
  geom_ribbon(aes(ymax = val, ymin = 0, fill = type, group = type))

我希望您可以将填充颜色改为渐变色(从蓝色到红色 - 垂直方向。因此,在底部以蓝色开始,顶部是红色,并有参数来控制颜色变化的平滑度)。
我找到了以下资源: https://ggplot2.tidyverse.org/reference/scale_gradient.html 不幸的是,由于我的数据不连续,它对我没有用。

2
这并不是一件容易的事情。scale_gradient 被设计用于将数据映射到不同的颜色。你没有与不同颜色相对应的数据。有一些 hacky 的解决方法(可能是重复的),例如:如何在多边形内生成渐变填充?如何制作渐变颜色填充时间序列图? - Gregor Thomas
1个回答

11
以下代码将执行此操作(但是水平方向):
library(scales) # for muted
ggplot(df22, aes(x = x, y = val)) +
  geom_ribbon(aes(ymax = val, ymin = 0, group = type)) +
  geom_col(aes(fill = val)) +
  scale_fill_gradient2(position="bottom" , low = "blue", mid = muted("blue"), high = "red", 
                       midpoint = median(df22$val)) 

Ribbon-Horizontally

如果您想垂直排列,可以使用 coord_flip() 将坐标翻转并倒置。
ggplot(df22, aes(x = val, y = x)) +
  geom_ribbon(aes(ymax = val, ymin = 0)) +
  coord_flip() +
  geom_col(aes(fill = val)) +
  scale_fill_gradient2(position="bottom" , low = "blue", mid = muted("blue"), high = "red", 
                       midpoint = median(df22$val)) 

Ribbon-Vertically

或者,如果您希望它具有垂直渐变的水平效果(如您所要求的),则可能需要通过调整数据并使用geom_segment()而不是geom_ribbon()来实现,如下所示:

vals <- lapply(df22$val, function(y) seq(0, y, by = 0.001))
y <- unlist(vals)
mid <- rep(df22$x, lengths(vals))
d2 <- data.frame(x = mid - 1, xend = mid + 1, y = y, yend = y)

ggplot(data = d2, aes(x = x, xend = xend, y = y, yend = yend, color = y)) +
  geom_segment(size = 1) +
  scale_color_gradient2(low = "blue", mid = muted("blue"), high = "red", midpoint = median(d2$y)) 

这将给你以下内容:

enter image description here

希望您觉得它有用。

非常感谢您的出色回答。我已经点赞了,因为我们非常接近。我还需要“垂直地。从底部开始是蓝色,到顶部是红色”,这也可能吗? - Tlatwork
谢谢您的回复。不幸的是,这是不可能的。必须是竖直的 - 蓝色在底部,红色在顶部。 - Tlatwork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接