问题描述
我正在尝试使用ggplot在R中创建一个游泳图。但是,当我想在情节的两个堆叠条形图之间留出“空”空间时,我遇到了一个问题:这些条形图彼此相邻排列。
代码和示例数据
我有以下示例数据:
# Sample data
df <- read.table(text="patient start keytreat duration
sub-1 0 treat1 3
sub-1 8 treat2 2
sub-1 13 treat3 1.5
sub-2 0 treat1 4.5
sub-3 0 treat1 4
sub-3 4 treat2 8
sub-3 13.5 treat3 2", header=TRUE)
当我使用以下代码生成游泳图时,最终得到了3个主题的游泳图。受试者2仅接受了1次治疗(治疗1),因此此显示正确。
但是,对象1接受了3种治疗:从时间点0到时间点3的治疗1,然后从3到8不进行任何治疗,然后从8到10进行治疗2,等等...
以某种方式绘制数据,在1号和3号患者中,所有治疗都是连续的,而不是在它们之间有“空”间隔。
# Plot: bars
bars <- map(unique(df$patient)
, ~geom_bar(stat = "identity", position = "stack", width = 0.6,
, data = df %>% filter(patient == .x)))
# Create plot
ggplot(data = df, aes(x = patient,
y = duration,
fill = reorder(keytreat,-start))) +
bars +
guides(fill=guide_legend("ordering")) +
coord_flip()
问题
在该游泳图中如何在两个非连续治疗之间包含空白?
答案 0 :(得分:1)
在这种情况下,我认为geom_bar
不是正确的选择。这确实是为了显示频率或计数,您无法显式控制其开始或结束坐标。
geom_segment
可能就是您想要的:
library(tidyverse)
# Sample data
df <- read.table(text="patient start keytreat duration
sub-1 0 treat1 3
sub-1 8 treat2 2
sub-1 13 treat3 1.5
sub-2 0 treat1 4.5
sub-3 0 treat1 4
sub-3 4 treat2 8
sub-3 13.5 treat3 2", header=TRUE)
# Add end of treatment
df_wrangled <- df %>%
mutate(end = start + duration)
ggplot(df_wrangled) +
geom_segment(
aes(x = patient, xend = patient, y = start, yend = end, color = keytreat),
size = 8
) +
coord_flip()
由reprex package(v0.2.1)于2019-03-29创建