渐变填写ggplot2

Tha*_*uys 2 r ggplot2

如果有以下情节说.

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))
Run Code Online (Sandbox Code Playgroud)

而不是蓝色我想要一个渐变填充(从蓝色到红色 - 垂直.所以从底部的蓝色开始,红色在顶部,用参数来控制颜色变化的平滑度).

我找到了以下资源:https: //ggplot2.tidyverse.org/reference/scale_gradient.html

不幸的是,它没有为我工作,因为我的数据不是连续的(?).

Tee*_*Kea 6

以下代码将执行此操作(但水平):

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)) 
Run Code Online (Sandbox Code Playgroud)

丝带平铺

如果要垂直制作,可以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)) 
Run Code Online (Sandbox Code Playgroud)

飘带垂直

或者,如果您希望它与垂直渐变(根据您的要求)保持水平,您可能需要通过播放数据并使用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)) 
Run Code Online (Sandbox Code Playgroud)

这将为您提供以下内容:

在此输入图像描述

希望你觉得它有用.