让我们有以下虚拟数据:
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解决方案。
1条答案
按热度按时间s6fujrry1#
第一步是将
position
按每个id的第一个position
移动。第二步是移动线段的起始位置,即移动或轻推位置的最小值减去每个id的第一个点的位置。请注意,我使用单独的汇总数据集进行线段。