R 中 ggplot 中的组线图中缺少线段

发布于 2025-01-09 09:06:36 字数 804 浏览 1 评论 0原文

我使用 ggplot 在 R 中按组创建了累积和的线图。我的问题是有些行包含缺失的段——要么在行的开头、行的末尾,要么在行的中间。 我该如何解决这个问题?

问题

library(dplyr)
library(ggplot2)

df.1 <-
  data.frame(
    x = c(1, 2, 3, 4),
    y = c(10, 23, 25, 28),
    z = factor(1)
  )

df.2 <-
  data.frame(
    x = c(3, 4, 5, 6),
    y = c(5, 10, 12, 16),
    z = factor(2)
  )

df.3 <-
  data.frame(
    x = c(1, 3, 5, 6),
    y = c(2, 7, 8, 12),
    z = factor(3)
  )

df <-
  df.1 %>%
    full_join(
      df.2
    ) %>%
    full_join(
      df.3
    )

df

plot <-
  ggplot(
    df
  ) +
  aes(
    x = x,
    y = y,
    color = z
  ) +
  geom_point() +
  geom_line() +
  theme_minimal()

plot

I have created a line plot by groups for a cumulative sum in R using ggplot. My problem is that some of the lines contain missing segments -- either at the beginning of a line, end of a line, or in the middle of a line.
How do I fix this?

problem

library(dplyr)
library(ggplot2)

df.1 <-
  data.frame(
    x = c(1, 2, 3, 4),
    y = c(10, 23, 25, 28),
    z = factor(1)
  )

df.2 <-
  data.frame(
    x = c(3, 4, 5, 6),
    y = c(5, 10, 12, 16),
    z = factor(2)
  )

df.3 <-
  data.frame(
    x = c(1, 3, 5, 6),
    y = c(2, 7, 8, 12),
    z = factor(3)
  )

df <-
  df.1 %>%
    full_join(
      df.2
    ) %>%
    full_join(
      df.3
    )

df

plot <-
  ggplot(
    df
  ) +
  aes(
    x = x,
    y = y,
    color = z
  ) +
  geom_point() +
  geom_line() +
  theme_minimal()

plot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

℉服软 2025-01-16 09:06:36

您可以使用 base::expand.gridzoo::fill 来解决此问题。

解决方案

df.shell <-
  expand.grid(
    unique(df$z),
    unique(df$x)
  )
names(df.shell) <- c("z", "x")

df.shell

df.full <-
  df.shell %>%
  left_join(df, by = c("z", "x")) %>%
  arrange(z, x)

df.full

df.full.filled <-
  df.full %>%
  group_by(z) %>%
  mutate(y = ifelse(x == 1 & is.na(y), 0, y)) %>%
  fill(y, .direction = "updown")

df.full.filled

plot.filled <-
  ggplot(
    df.full.filled
  ) +
  aes(
    x = x,
    y = y,
    color = z
  ) +
  geom_point() +
  geom_line() +
  theme_minimal()

plot.filled

You can use base::expand.grid and zoo::fill to fix this.

solution

df.shell <-
  expand.grid(
    unique(df$z),
    unique(df$x)
  )
names(df.shell) <- c("z", "x")

df.shell

df.full <-
  df.shell %>%
  left_join(df, by = c("z", "x")) %>%
  arrange(z, x)

df.full

df.full.filled <-
  df.full %>%
  group_by(z) %>%
  mutate(y = ifelse(x == 1 & is.na(y), 0, y)) %>%
  fill(y, .direction = "updown")

df.full.filled

plot.filled <-
  ggplot(
    df.full.filled
  ) +
  aes(
    x = x,
    y = y,
    color = z
  ) +
  geom_point() +
  geom_line() +
  theme_minimal()

plot.filled
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文