R ggplot:重新排序分类y轴(甘特图)

R ggplot:重新排序分类y轴(甘特图),r,ggplot2,tidyverse,R,Ggplot2,Tidyverse,我正在尝试从一个包含不同任务的表中生成甘特图(每个任务都有开始日期和结束日期) 库(tidyverse) #样本数据 df1%变异(从=截止日期(从), 截止日期=截止日期(截止日期))%>% pivot_longer(cols=c(from,to),value_to=“date”)%>% ggplot(aes(x=日期,y=任务,颜色=组))+ 几何尺寸线(lwd=3)+ 几何点(aes(颜色=组),α=0.5,pch=18,大小=5)+ 缩放日期(position=“bottom”,date

我正在尝试从一个包含不同任务的表中生成甘特图(每个任务都有开始日期和结束日期)

库(tidyverse)
#样本数据
df1%变异(从=截止日期(从),
截止日期=截止日期(截止日期))%>%
pivot_longer(cols=c(from,to),value_to=“date”)%>%
ggplot(aes(x=日期,y=任务,颜色=组))+
几何尺寸线(lwd=3)+
几何点(aes(颜色=组),α=0.5,pch=18,大小=5)+
缩放日期(position=“bottom”,date\U breaks=“1周”,date\U标签=“%U”)+
主题_bw()+
主题(plot.title=element\u text(hjust=0.5))+
标题(“里程碑”)+
实验室(y=“”,x=“”,color=“负责”)
到目前为止还不错,但现在我有一个大问题和一个小问题:

主要问题:

  • 我如何在y轴上重新排序数据中显示的类别(而不是字母顺序)?自上而下应该是:金融、研究和其他。此外,在每个类别(财务、研究、其他)中,应按开始日期对行进行排序(即,首先开始的任务应位于顶部)
小问题:

  • 在x轴上,我如何为每个月绘制一条较粗的线,为每个星期绘制一条较细的线

谢谢你的帮助

可以这样实现:

  • 正如@RuiBarrades在他的评论中提到的,要获得正确的顺序,您必须转换为一个因子,并以正确的顺序设置级别。首先,设置组的级别。其次,为了按所需的顺序获得任务,我按组和开始日期重新排列数据集,并使用
    forcats::fct_以顺序设置任务的级别

  • 如果我没弄错的话,你希望每周和每月都有不同的网格线吗?这可以通过设置
    date\u breaks\u minor=“month”
    并通过
    theme
    panel.grid.minor/major.x
    设置网格线的样式来实现。在这里,我选择了“黑色”,但如果您喜欢不同的尺寸,可以通过
    size
    来选择

  • 库(tidyverse)
    图书馆(GG2)
    #样本数据
    df1%变异(从=截止日期(从),
    至=截止日期(至),
    组=系数(组,级别=c(“金融”、“研究”、“其他”))%>%
    排列(描述(组),描述(从))%>%
    突变(任务=forcats::fct_顺序(任务))%>%
    pivot_longer(cols=c(from,to),value_to=“date”)%>%
    ggplot(aes(x=日期,y=任务,颜色=组))+
    几何尺寸线(lwd=3)+
    几何点(aes(颜色=组),α=0.5,pch=18,大小=5)+
    缩放日期(position=“bottom”,date\u breaks=“1周”,date\u minor\u breaks=“1个月”,
    日期标签=“%U”)+
    主题_bw()+
    主题(plot.title=element\u text(hjust=0.5),
    panel.grid.minor.x=元素(color=“black”))+
    标题(“里程碑”)+
    实验室(y=“”,x=“”,color=“负责”)
    

    1)
    库(tidyverse)
    也加载
    ggplot2
    ,不需要显式加载;2) 若要按分类变量对轴进行排序,请将其定义为具有所需级别顺序的因子,ggplot将保持该顺序,请参阅“forcats::fct_inoorder(task)”部分的重要提示。在规模上比使用与给定潜在范围的小组/负责人相同的方法要好得多。OP-如果您正在从数据帧生成多个图形/项目,请从图形调用中取出前进管道(%%>%),并将df group列作为因子版本进行重写。哇,太棒了!非常感谢。只是一个后续问题:为什么月份的线条不完全在周的节拍上?这是因为一般来说,周并不从一个月的开始开始,当然,因为一个月大约等于4.33周。。。。但是您可以尝试使用
    scale\u x\u date(position=“bottom”、date\u breaks=“4周”、date\u minor\u breaks=“1周”
    并使用
    panel.grid.major.x=element\u line(color=“black”)
    而不是
    panel.grid.minor.x
    ,后者使用的周期为4周。
    library(tidyverse)
    
    # Sample data
    df1 <- data.frame(from = c("2020-01-01", "2020-02-02", "2020-05-04", "2020-02-01", "2020-01-20", "2020-02-10"),
                      to =   c("2020-03-30", "2020-03-15", "2020-05-20", "2020-04-05", "2020-03-05", "2020-04-13"),
                      task= c("Task 1", "Task 2", "Task 3", "Task 4", "Task 5", "Task 6"),
                      group = c("Finance", "Finance", "Research", "Research", "Other", "Other")
    )
    
    # Plot gantt-chart
    df1 %>% mutate(from = as.Date(from),
                   to = as.Date(to)) %>% 
      pivot_longer(cols = c(from, to), values_to = "date") %>%
      ggplot(aes(x=date, y=task, colour = group)) + 
      geom_line(lwd=3) +
      geom_point(aes(color=group), alpha=.5, pch=18, size=5) +
      scale_x_date(position="bottom", date_breaks = "1 week", date_labels="%U") +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5))+
      ggtitle("Milestones") +
      labs(y="", x = "", colour="Responsible")