对 geom_line 和 x 轴之间的区域进行着色

2023-12-02

我有两张图显示供给和需求,在一张图中我从供给中减去了需求以显示由此产生的不对称性。我想对 x 轴和不对称负值部分之间的区域进行阴影处理,以显示缺陷的程度。

我目前使用以下代码:

plot.asymmetry <- ggplot(data=df.overview.month, 
                         aes(x=Date.Time, y=Asymmetry)) +    
      geom_area(data=subset(df.overview.month, Asymmetry < 0),     
                         aes(x=Date.Time, y=Asymmetry)) 

然而,正如预期的那样,这不会对 geom_line 和 x 轴之间的区域进行着色,而只会对不对称数据的负值之间的区域进行着色,这完全是另一回事,如结果图中所示:

enter image description here

有什么办法可以克服这个问题吗?

/编辑:一些示例数据:

time.initial <- as.POSIXct("2010-12-31 23:00:00", tz="GMT")
Date.Time<-vector()
for(i in 1:24) {
Date.Time[i] <- time.initial + i*3600
}

Demand<-vector()
for(i in 0:23) {
Demand[i+1] <- 155 + 20*sin((pi/12)*i - (pi/2)) + 10*sin((pi/4380)*i + (pi/2))
}

Supply<-vector()
for(i in 0:23) {
Supply[i+1] <- 165 + 5*sin((pi/4380)*i - (pi/2)) + rnorm(1, mean=0, sd=0.20*165)
}

df.overview.month <- data.frame(Date.Time, Demand, Supply, Asymmetry=Supply-Demand)

下面是一些代码从 Matlab 移植计算线段之间的交集。如果将其应用在 x 轴(固定)和每对连续点之间,您将获得一个新坐标列表,该列表指示您的坐标之间的交叉点geom_line和 x 轴。由此,可以轻松地对相关多边形进行着色。请注意,我尚未正确测试移植的 Matlab 代码。

enter image description here

## Ported from Matlab to R
## Copyright (c) 2010, U. Murat Erdem
## All rights reserved.
## http://www.mathworks.com/matlabcentral/fileexchange/27205
lineSegmentIntersect <- function(XY1, XY2){

  n_rows_1 <- nrow(XY1)
  n_cols_1 <- ncol(XY1)
  n_rows_2 <- nrow(XY2)
  n_cols_2 <- ncol(XY2)

  stopifnot(n_cols_1 == 4 && n_cols_2 == 4)

  nc <- n_rows_1 * n_rows_2
  X1 <- matrix(XY1[,1], nrow=nc, ncol=1)
  X2 <- matrix(XY1[,3], nrow=nc, ncol=1)
  Y1 <- matrix(XY1[,2], nrow=nc, ncol=1)
  Y2 <- matrix(XY1[,4], nrow=nc, ncol=1)

  XY2 <- t(XY2)

  X3 <- matrix(XY2[1,], nrow=nc, ncol=1)
  X4 <- matrix(XY2[3,], nrow=nc, ncol=1)
  Y3 <- matrix(XY2[2,], nrow=nc, ncol=1)
  Y4 <- matrix(XY2[4,], nrow=nc, ncol=1)

  X4_X3 <- X4-X3
  Y1_Y3 <- Y1-Y3
  Y4_Y3 <- Y4-Y3
  X1_X3 <- X1-X3
  X2_X1 <- X2-X1
  Y2_Y1 <- Y2-Y1

  numerator_a <- X4_X3 * Y1_Y3 - Y4_Y3 * X1_X3
  numerator_b <- X2_X1 * Y1_Y3 - Y2_Y1 * X1_X3
  denominator <- Y4_Y3 * X2_X1 - X4_X3 * Y2_Y1

  u_a <- numerator_a / denominator
  u_b <- numerator_b / denominator

  INT_X <- X1 + X2_X1 * u_a
  INT_Y <- Y1 + Y2_Y1 * u_a
  INT_B <- (u_a >= 0) & (u_a <= 1) & (u_b >= 0) & (u_b <= 1)
  PAR_B <- denominator == 0
  COINC_B <- (numerator_a == 0 & numerator_b == 0 & PAR_B)

  data.frame(x=INT_X[INT_B], y=INT_Y[INT_B])

}


set.seed(123)
x <- sort(runif(50, -10, 10))
y <- jitter(sin(x), a=2)
n <- length(x)
xy1 <- matrix(c(-10, 0, 10, 0), ncol=4)
xy2 <- cbind(x[-n], y[-n], x[-1], y[-1])
test <- lineSegmentIntersect(xy1, xy2)

library(ggplot2)
d <- data.frame(x=x, y=y)
d2 <- rbind(d, test)
d2 <- subset(d2[order(d2$x), ], y <=0)
p <- qplot(x, y, data=d, geom="path")

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

对 geom_line 和 x 轴之间的区域进行着色 的相关文章

  • 在 dfm 中查找非英语标记并将其删除

    在 dfm 中如何检测非英语单词并将其删除 dftest lt data frame id 1 3 text c Holla this is a spanish word English online here Bonjour commen
  • 如何按组计算日期之间的时间差

    我有一个包含日期 时间和位置的数据框 我想计算组内记录与上一条记录 根据日期排列 之间的分钟差异 并变异为新列 我已经弄清楚如何使用循环来完成此操作 但这仅适用于所有组 位置 而且我不确定如何按组执行此操作 fake data set fo
  • 如何重新格式化数据并映射它?

    假设我有数据 其中列名称是城市 行名称是经度和纬度 Columbus Nashville Austin Washington D C London Manchester lon 82 99879 86 7816 97 74306 77 03
  • 计算网络中的周期

    最好的方法是什么 或者是否有任何方法可以实现对网络中的 3 个和 4 个周期进行计数 3 个周期等于从一个模式网络计算的三个节点 三角形 的连接组 4 个周期等于由两个模式网络计算的四个节点 方块 的连接组 如果我有这样的网络 onemod
  • 使用 dplyr::filter 创建 R 函数问题

    我查看了其他答案 但找不到使下面的代码起作用的解决方案 基本上 我正在创建一个函数inner join两个数据框和filter基于函数中输入的列 问题是filter部分功能不起作用 但是 如果我将过滤器从函数中取出并附加它 它就会起作用my
  • 两个数据框之间逐元素的百分比变化

    我有 2 个数据框 它们具有相同数量的匹配列和行 例如 df 2010 lt data frame col1 c Connecticut Delaware District of Columbia Florida Georgia col2
  • 使用 dplyr::mutate 重新编码而不在函数中工作

    我正在尝试使用dplyr mutate across 重新编码 a 中的指定列tbl 单独使用它们效果很好 但我无法让它们在函数中工作 library dplyr library tidyr df1 lt tibble Q7 1 1 5 Q
  • 如何在 dbplyr 中使用自定义 SQL 函数?

    我想计算数据库中的 Jaro Winkler 字符串距离 如果我将数据带入 R 使用collect 我可以轻松地使用stringdist函数从stringdist包裹 但我的数据非常大 我想过滤 Jaro Winkler 距离before将
  • 如何使用 R 获取所有 S&P500 公司代码列表?

    我想在R中制作FOR语句来一次性分析股票数据 但我不知道如何获得 S P 公司代码列表 请让我知道解决方案 谢谢 library rpart library rpart plot library quantmod startDate as
  • 使用 cmd 和 R 配置 databricks

    我正在尝试使用 databricks cli 并调用 databricks 配置 这就是我从 cmd 执行此操作的方法 somepath gt databricks configure token Databricks Host shoul
  • 在 R 中组合/合并列

    我可能在这个问题上遗漏了一些很容易的东西 我在任何地方都找不到正确的答案 我真的需要继续前进 所以我过度简化了我的数据 eventID lt c 2 4 Time lt c 09 32 09 43 df1 lt data frame eve
  • 求R中3列中每一行的最大值

    我需要计算 3 列中每行的最大值 一个表可以是 x c 1 2 3 4 5 y c 2 3 3 1 1 z c 4 3 2 1 1 df lt data frame x y z 我需要得到 x y z max 1 1 2 4 4 2 2 3
  • 如何计算两个邮政编码之间的距离?

    我有一个美国邮政编码列表 我必须计算所有邮政编码点之间的距离 它是一个 6k 邮政编码长列表 每个实体都有邮政编码 城市 州 纬度 经度 面积和人口 所以 我必须计算所有点之间的距离 即 6000C2 组合 这是我的数据示例 我已经在 SA
  • 从数据/系数创建 lm 对象

    有谁知道可以在给定数据集和系数的情况下创建 lm 对象的函数 我对此很感兴趣 因为我开始使用贝叶斯模型平均 BMA 并且我希望能够根据 bicreg 的结果创建 lm 对象 我想访问所有不错的通用 lm 函数 例如诊断绘图 预测 cv lm
  • 如何改变R中数据框的形状? (将具有相同名称的列堆叠在一起)

    我正在尝试重塑 R 中的数据框 Gene ID Value Gene ID 1 Value 1 Gene ID 2 Value 2 1 A 0 A 3 A 1 2 B 5 B 6 B 5 3 C 7 C 2 C 7 4 D 8 D 9 D
  • 在 R 中,将一列值与所有其他列进行比较

    我对 R 非常陌生 我有一个问题对于这里的专家来说可能非常简单 假设我有一个表 sales 其中包含 4 个客户 ID 123 126 和 4 个产品 A B C D ID A B C D 123 0 1 1 0 124 1 1 0 0 1
  • 合并结果的行数多于一个数据框

    我有两个数据框 第一个包含 9994 行 第二个包含 60431 行 我想合并两个数据框 以便合并后的数据框包含两个数据框的组合列 但只包含 9994 行 但是 合并后我得到了超过 9994 行 我怎样才能确保这种情况不会发生 df1 re
  • 在 ggplot2 中隐藏单个几何图例

    我将相同的变量 颜色 映射到两个不同几何图形中的颜色 我希望它们要么出现在单独的图例中 DHJ 和 EFI 要么最好完全跳过第二个图例 对于 E F 和 I 目前 R 将两者混合在一起 并给我一个图例 其中按字母顺序列出了 DEFHIJ 所
  • 根据值绘制具有条件颜色的折线图

    我想绘制折线图 根据值 它应该改变它的颜色 我发现的是 plot sin seq from 1 to 10 by 0 1 type p col ifelse sin seq from 1 to 10 by 0 1 gt 0 5 red ye
  • 在 R 中提取栅格的最快方法(提高我的可重现代码的时间)

    我想知道我是否已最大化提取栅格中某个点周围缓冲区域平均值的速度 本地的性能可以进一步提高吗 I use parallel mclapply已经 我知道我可以通过在集群上设置和运行它来获得进一步的收益 使用集群或获得更多的CPU不是我正在寻找

随机推荐