R语言 在ggplot2中,根据给定条件对齐绘制的线

bkhjykvo  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(179)

让我们有以下虚拟数据:

library(tidyverse)
library(ggplot2)

df <- tibble(
  id = c(rep("abcdef-123", 3), rep("defghi-678", 2), rep("mnopqr-345", 1)),
  length = c(rep(137, 3), rep(293, 2), rep(91, 1)),
  position = c(10, 77, 103, 82, 222, 45)
)

该 Dataframe 包含3列。“id”对应于对象(项目)名称,“length”对应于项目的总长度,而“position”指示在给定的“length”中发生感兴趣的特征的位置。因此,每个唯一的“id”具有其唯一的“length”,而每个“id”可能存在多于一个的“position”。
我按“id”对数据进行分组,因为这是每个项目的唯一标签:

df_grouped <- df %>% group_by(id)

然后,我想以以下方式绘制数据:

  • 每个“id”应当被描绘为单独的水平线
  • 位置应标记为点
  • 应该根据每个“id”中的第一个(或理想地:选择的)位置来对齐行。

这是我目前所能得到的:

ggplot2::ggplot(df_grouped, aes(x=length, y=id, xend=0, yend=id)) + 
  ggplot2::geom_segment()+ 
  ggplot2::geom_point(aes(x=position, y=id), size=2) + 
  ggplot2::theme_void() +
  ggplot2::theme(axis.ticks.x = element_blank(), axis.text.x = element_blank())#+ggplot2::scale_y_discrete()

这就是我想要实现的(我在gimp中做了这个):

我不知道如何有条件地对齐线条(根据所选的第一个或第n个位置)。我尝试了多种解决方案,包括在括号中索引位置,同时将参数传递给美学。这不起作用,所以我寻求帮助。
目前正试图用Bioconductor解决这个问题,但会喜欢base R或ggplot2解决方案。

s6fujrry

s6fujrry1#

第一步是将position按每个id的第一个position移动。第二步是移动线段的起始位置,即移动或轻推位置的最小值减去每个id的第一个点的位置。请注意,我使用单独的汇总数据集进行线段。

library(tidyverse)

df <- df |>
  mutate(start = min(position), .by = id) |>
  mutate(
    start_max = max(start),
    nudge = start_max - start,
    position_nudge = position + nudge
  )

df_segment <- df |>
  mutate() |>
  summarise(
    x = min(position_nudge - start),
    xend = min(x + length),
    .by = id
  )

ggplot(df) +
  geom_segment(data = df_segment, aes(x = x, xend = xend, y = id, yend = id)) +
  geom_point(aes(x = position_nudge, y = id), size = 2) +
  theme_void() +
  theme(
    axis.ticks.x = element_blank(),
    axis.text.x = element_blank()
  )

相关问题