用不同的颜色填充水平线上方和下方的区域[重复]

2023-11-27

Aim

我正在尝试填充 R 中 ggplot 生成的图中两条线之间的区域。我想用与水平线下方不同的颜色填充水平线上方的线之间的所有内容。

我成功地用单一颜色填充了两条线之间的所有内容,但是,我无法用两种不同的颜色区分垂直线的上方和下方。

Code

set.seed(123) 

# Load packages
library(tidyverse)

# Create sample dataframe
df <- data.frame(x=seq(1,50,1),y=runif(50, min = 0, max = 10))

# Generate plot
ggplot(data = df, aes(x = x, y = y)) +
  geom_line() +
  geom_hline(yintercept = 5) +
  theme_classic() +
  geom_ribbon(aes(ymin=5,ymax=y), fill="blue")

Question

如何用不同的颜色填充水平线上方和下方的空间?


您可以计算两条线相交点的坐标并将其添加到数据框中:

m <- 5 # replace with desired y-intercept value for the horizontal line

# identify each run of points completely above (or below) the horizontal
# line as a new section
df.new <- df %>%
  arrange(x) %>%
  mutate(above.m = y >= m) %>%
  mutate(changed = is.na(lag(above.m)) | lag(above.m) != above.m) %>%
  mutate(section.id = cumsum(changed)) %>%
  select(-above.m, -changed)

# calculate the x-coordinate of the midpoint between adjacent sections
# (the y-coordinate would be m), & add this to the data frame
df.new <- rbind(
  df.new,
  df.new %>%
    group_by(section.id) %>%
    filter(x %in% c(min(x), max(x))) %>%
    ungroup() %>%
    mutate(mid.x = ifelse(section.id == 1 | 
                            section.id == lag(section.id), 
                          NA,
                          x - (x - lag(x)) / 
                            (y - lag(y)) * (y - m))) %>% 
    select(mid.x, y, section.id) %>%
    rename(x = mid.x) %>%
    mutate(y = m) %>%
    na.omit())

使用此数据框,您可以定义两个单独的geom_ribbon具有不同颜色的层。下面的结果比较(注:我还添加了一个geom_point图层用于插图,并更改了颜色,因为原件中的蓝色有点刺眼......)

p1 <- ggplot(df,
             aes(x = x, y = y)) +
  geom_ribbon(aes(ymin=5, ymax=y), fill="dodgerblue") +
  geom_line() +
  geom_hline(yintercept = m) +
  geom_point() + 
  theme_classic()

p2 <- ggplot(df.new, aes(x = x, y = y)) +      
  geom_ribbon(data = . %>% filter(y >= m),
              aes(ymin = m, ymax = y), 
              fill="dodgerblue") +
  geom_ribbon(data = . %>% filter(y <= m),
              aes(ymin = y, ymax = m), 
              fill = "firebrick1") +
  geom_line() +
  geom_hline(yintercept = 5) +
  geom_point() +      
  theme_classic()

result

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用不同的颜色填充水平线上方和下方的区域[重复] 的相关文章

随机推荐

  • 使用 WCF 和 MTOM 进行流式传输

    我使用带有流传输模式的 WCF 绑定 用于向服务上传二进制内容或从服务下载二进制内容 我已经成功让它发挥作用了 我将包括配置 合同等以供参考 我做了一些测试来对不同的绑定和编码进行基准测试 上传结果似乎没问题 NetTcp 最快 其次是 B
  • 通过代码在 Windows 10 上启用平板电脑模式?

    我阅读了有关如何检测 Windows 10 设备是否处于平板电脑模式的各种方法 最值得注意的是下面的主题 如何在 Windows 窗体应用程序中检测 Window 10 何时进入平板电脑模式 我想通过代码 Net C 启用 禁用平板电脑模式
  • VScode 崩溃(原因:'oom',代码:'-536870904')

    我试图打开以前打开过的文件夹 但它崩溃了 我可以打开其他项目 重新启动计算机也没有帮助 也许是因为我在这个文件夹中打开了一个大文件 400mb 但我无法关闭这个文件 因为每次我尝试打开工作区时 vscode 都会崩溃 https githu
  • Android AppCompat 需要 API 级别 11

    我有一个应用程序使用AppCompat支持库ActionBars 现在 我尝试为此目的创建一个具有某种样式的新主题 xml 文件 所以就像在这里完成的一样 http developer android com guide topics
  • memcached:哪个更快,执行添加(并检查结果),或执行获取(并在返回 false 时设置)

    这个问题的标题不太清楚 但是代码和问题很简单 假设我想每天向用户展示一次广告 为了实现这一目标 每次他们访问我网站上的页面时 我都会检查某个内存缓存键上是否存储了任何数据 如果是这样 请不要展示广告 如果不是 则将值 1 存储在该密钥中 过
  • 使用 GIDSignIn 处理使用另一个 Google 应用程序登录时不获取 Google 用户

    我在用着iOS 版 Google 登录当使用模拟器时 它工作正常 因为没有安装谷歌应用程序并且用户正在获取 但是当使用我的iPhone 6设备时 打开youtube 其中有一些注册帐户 来处理登录 之后 当返回应用程序代码时 不要输入此功能
  • 数据向量列表的快速滚动和(二维矩阵)

    我正在寻找一种快速计算滚动和的方法 可能使用 Numpy 这是我的第一个方法 def func1 M w Rtn np zeros M shape 0 M shape 1 w 1 for i in range M shape 1 w 1 R
  • 更改ggplot2中轴文本的字体大小和方向

    我正在绘制一个图表 其中 x 轴上有一个分类变量 y 轴上有一个数值变量 对于 x 轴 由于存在许多数据点 默认文本格式会导致每个刻度线的标签与其他标签重叠 如何 a 更改轴文本的字体大小和 b 更改文本的方向以使文本垂直于轴 Use th
  • Pandas:InvalidIndexError:重新索引仅对具有唯一值的索引对象有效

    我有两个数据框 用于存储有关在商店购买的产品的数据 df1存储有关商店名称 产品 ID 产品名称和购买日期的数据 df2存储有关产品 ID 产品名称和类型的数据 我正在尝试更新df2接收日期值df1但仅适用于该类型的产品P 下面给出的是数据
  • JavaScript - 从数组中的多个输入获取值

    我正在尝试从数组中具有相同 id 的多个输入中获取值 我已经使用了论坛 但还没有找到适合我的解决方案 Exmaple
  • 我什么时候应该使用像 OSGI 这样的平台,什么时候必须避免使用它?

    我的问题非常简单 应用程序的哪些功能迫使开发人员利用类似 OSGI 的系统 在什么情况下不需要这样的实用程序 我刚刚发布了另一个问题的以下链接 OSGi解决什么问题 但我认为这里更合适 Hal Hildebrand 撰写了一篇博客 介绍了他
  • 在 .NET 3.5 中使用反射生成子类列表

    在运行时 我想指定一个父类 然后程序将生成所有子类的列表 无论多少代 例如 如果我有Entity作为父母 并且Item Entity and Actor Entity 将有两个字符串 Actor 和 Item 我看到System Refle
  • 如何向 log4j 消息添加前缀(在对象级别)

    我使用 log4j2 我想为我的所有消息添加前缀 该前缀被传递给构造函数参数 它取决于类的实例 所以我们处于对象级别 而不是类或线程 例如 我有一个A类实例化就像new A 152 所以当我使用log error message 在这堂课上
  • 有没有办法强制 ASP.NET Web API 返回纯文本?

    我需要从 ASP NET Web API 控制器获取纯文本响应 我尝试过提出请求Accept text plain但它似乎并没有达到目的 此外 该请求是外部的 不受我的控制 我要完成的是模仿旧的 ASP NET 方式 context Res
  • 从基类访问子类的静态成员

    我有以下基类 class BaseClass public static myFlag boolean false constructor reference ChildClass myFlag 与儿童班 class ChildClass
  • 当我在 Chrome 中单击“允许”时,为什么 getUserMedia 会抛出 [object NavigatorUserMediaError]?

    最近 我在尝试通过我的网站访问客户的麦克风时开始出现错误 当Chrome询问是否允许网站访问用户的麦克风时 object NavigatorUserMediaError 无论他们点击 允许 还是 拒绝 都会产生 无论麦克风是否实际插入计算机
  • 在Python中分割分号分隔的字符串

    我想分割一个以分号分隔的字符串 以便我可以使用 Python 存储每个单独的字符串 以用作 XML 标记之间的文本 字符串值如下所示 08 26 2009 08 27 2009 08 29 2009 它们只是存储为字符串值的日期 我想迭代每
  • iOS:带有按钮图像的导航栏

    我想创建一个导航栏 其中图像作为导航栏右侧的按钮 像下面的快照 我怎样才能实现这个目标 希望这可以帮助 viewController navigationItem titleView UIImageView alloc initWithIm
  • 如何在 Go 中获取文件的组 ID (GID)?

    os Stat 返回一个FileInfo对象 它有一个Sys 返回一个方法Interface 没有方法 虽然我有能力fmt Printf 它 看到 Gid 我无法以编程方式访问 Gid 我如何在这里检索文件的 Gid file info o
  • 用不同的颜色填充水平线上方和下方的区域[重复]

    这个问题在这里已经有答案了 Aim 我正在尝试填充 R 中 ggplot 生成的图中两条线之间的区域 我想用与水平线下方不同的颜色填充水平线上方的线之间的所有内容 我成功地用单一颜色填充了两条线之间的所有内容 但是 我无法用两种不同的颜色区