【问题标题】:fill area between two lines with different x-values用不同的 x 值填充两条线之间的区域
【发布时间】:2018-11-13 20:18:41
【问题描述】:

我有一个包含两列 x 和 y 的数据框。每行代表一条线,每个单元格中是一个包含 51 个连续观测值的列表(因此每行中有 2 个列表代表 x 和 y)。

我想填充数据框中的行之间的空间。

问题是 x 和 y 存在随机性,所以我不能只取 x 上每个数据点的 ymin 和 ymax。

此代码将创建类似于我的实际数据集的示例数据(每行只有 2 行,每行 10 个观察值):

library(data.table)

genData <- function() {
  set.seed(42)
  genOneLine <- function(m_x, m_y) {
    xs = seq(0,1,by=0.1)
    x_ran <- rnorm(8, m_x, 0.1)
    xs[2:9] = xs[2:9] + x_ran
    ys = seq(0,1,by=0.1)
    y_ran <- rnorm(8, m_y, 0.1)
    ys[2:9] = ys[2:9] + y_ran
    return (data.table(x = list(xs), y = list(ys)))
  }
  return (rbind(genOneLine(-0.1, -0.1), genOneLine(0.1, 0.1)))
}

【问题讨论】:

  • 您可能无法分享您的真实数据,但您肯定可以将一些 example 数据放在一起吗?比如说,大约 10 行具有与您的真实数据相似的结构和属性来证明问题? See here for advice on creating reproducible examples。使用set.seed 使任何随机性可重现。
  • 你是什么意思“填充数据框中的行之间的空间”?您是指绘制数据还是插值?
  • 当然,我可以汇总一些示例数据!我认为它或多或少很清楚,但它可能会有所帮助。我会在几分钟后更新问题
  • 我已经更新了问题

标签: r ggplot2 plot


【解决方案1】:

看看这是不是你的想法?

library(dplyr)
library(ggplot2)
library(data.table)

df <- genData()

df %>%

  # add identifier variable to each line
  mutate(id = seq(1, n())) %>%

  # make each element of the list its own row
  tidyr::unnest() %>%

  # add sequence identifier, from start of line 1 to its end, then
  # from the end of line 2 to its start
  group_by(id) %>%
  mutate(order = ifelse(id == 1, seq(1, n()), n() + seq(n(), 1))) %>%
  ungroup() %>%

  # sort data frame
  arrange(order) %>%

  # plot
  ggplot(aes(x = x, y = y)) +
  geom_polygon(aes(group = 1), fill = "grey20", alpha = 0.5) +
  geom_path(aes(color = factor(id)), size = 2)

【讨论】:

  • 好吧,示例数据可能不是最好的,但这是我的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2023-03-22
  • 2017-11-09
  • 1970-01-01
  • 2022-01-13
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多