使用position_dodge绘制geom_Segment [英] Plotting geom_segment with position_dodge

查看:21
本文介绍了使用position_dodge绘制geom_Segment的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据集,其中包含个人在一段时间内在哪里工作的信息。更具体地说,我有关于个人在给定工作场所工作的间隔时间的信息。

library('tidyverse')
library('lubridate')

# individual A
a_id <- c(rep('A',1))
a_start <- c(201201)
a_end <- c(201212)
a_workplace <-c(1)

# individual B
b_id <- c(rep('B',2))
b_start <- c(201201, 201207)
b_end <- c(201206, 201211)
b_workplace <-c(1, 2)

# individual C
c_id <- c(rep('C',2))
c_start <- c(201201, 201202)
c_end <- c(201204, 201206)
c_workplace <-c(1, 2)
  
# individual D
d_id <- c(rep('D',1))
d_start <- c(201201)
d_end <- c(201201)
d_workplace <-c(1)

# final data frame
id <- c(a_id, b_id, c_id, d_id)
start <- c(a_start, b_start, c_start, d_start)
end <- c(a_end, b_end, c_end, d_end)
workplace <- as.factor(c(a_workplace, b_workplace, c_workplace, d_workplace))
mydata <- data.frame(id, start, end, workplace)

mydata_ym <- mydata %>%
  mutate(ymd_start = as.Date(paste0(start, "01"), format = "%Y%m%d"),
         ymd_end0 = as.Date(paste0(end, "01"), format = "%Y%m%d"),
         day_end = as.numeric(format(ymd_end0 + months(1) - days(1), format = "%d")),
         ymd_end = as.Date(paste0(end, day_end), format = "%Y%m%d")) %>%
  select(-ymd_end0, -day_end)

我想要一个曲线图,在那里我可以看到每个人在每个工作场所工作的时间模式以及他们是如何走动的。我尝试绘制geom_segment,因为我有个人在每个地方工作的开始日期和结束日期的信息。此外,由于同一个人可能在同一个月内在多个地方工作,所以我想使用position_dodge使其在同一id时间内不同工作地点重叠时可见。这是在此帖子中建议的:Ggplot (geom_line) with overlaps

ggplot(mydata_ym) +
  geom_segment(aes(x = id, xend = id, y = ymd_start, yend = ymd_end), 
               position = position_dodge(width = 0.1), size = 2) +
  scale_x_discrete(limits = rev) +
  coord_flip() +
  theme(panel.background  = element_rect(fill = "grey97")) +
  labs(y = "time", title = "Work affiliation")
我遇到的问题是:(I)position_dodge似乎不起作用,(Ii)我不知道为什么所有的段都被涂成黑色。我希望每个工作场所都有不同的颜色,并显示一个图例。

推荐答案

如果您将colour = workplace包含在aes()aes()映射中,您会得到颜色、图例和一些遮蔽,但它不能很好地工作(看起来position_dodge只适用于x,而不适用于xend.)?这似乎是position_dodge.

中的错误,或者至少是错误(&Q;&Q;)

但是,将geom_segment替换为适当使用geom_linerange似乎确实有效:

ggplot(mydata_ym) +
  geom_linerange(aes(x = id, ymin = ymd_start, ymax = ymd_end, colour = workplace),
               position = position_dodge(width = 0.1), size = 2) +
  scale_x_discrete(limits = rev) +
  coord_flip()

(省略某些切向分量)。

以前记录了一个类似的方法here-处理完colour=映射后,您的问题几乎是重复的.

这篇关于使用position_dodge绘制geom_Segment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆