Biểu đồ Gantt với R


Câu trả lời:


109

Hiện tại có một số cách đơn giản để tạo biểu đồ Gantt trong R.

Sử dụng Candela

library(candela)

data <- list(
    list(name='Do this', level=1, start=0, end=5),
    list(name='This part 1', level=2, start=0, end=3),
    list(name='This part 2', level=2, start=3, end=5),
    list(name='Then that', level=1, start=5, end=15),
    list(name='That part 1', level=2, start=5, end=10),
    list(name='That part 2', level=2, start=10, end=15))

candela('GanttChart',
    data=data, label='name',
    start='start', end='end', level='level',
    width=700, height=200)

nhập mô tả hình ảnh ở đây

Sử dụng DiagrammeR

library(DiagrammeR)

mermaid("
gantt
dateFormat  YYYY-MM-DD
title A Very Nice Gantt Diagram

section Basic Tasks
This is completed             :done,          first_1,    2014-01-06, 2014-01-08
This is active                :active,        first_2,    2014-01-09, 3d
Do this later                 :               first_3,    after first_2, 5d
Do this after that            :               first_4,    after first_3, 5d

section Important Things
Completed, critical task      :crit, done,    import_1,   2014-01-06,24h
Also done, also critical      :crit, done,    import_2,   after import_1, 2d
Doing this important task now :crit, active,  import_3,   after import_2, 3d
Next critical task            :crit,          import_4,   after import_3, 5d

section The Extras
First extras                  :active,        extras_1,   after import_4,  3d
Second helping                :               extras_2,   after extras_1, 20h
More of the extras            :               extras_3,   after extras_1, 48h
")

nhập mô tả hình ảnh ở đây

Tìm ví dụ này và nhiều ví dụ khác trên DiagrammeR GitHub


Nếu dữ liệu của bạn được lưu trữ trong a data.frame, bạn có thể tạo chuỗi để chuyển đến mermaid()bằng cách chuyển đổi nó sang định dạng thích hợp.

Hãy xem xét những điều sau:

df <- data.frame(task = c("task1", "task2", "task3"),
                 status = c("done", "active", "crit"),
                 pos = c("first_1", "first_2", "first_3"),
                 start = c("2014-01-06", "2014-01-09", "after first_2"),
                 end = c("2014-01-08", "3d", "5d"))

#   task status     pos         start        end
#1 task1   done first_1    2014-01-06 2014-01-08
#2 task2 active first_2    2014-01-09         3d
#3 task3   crit first_3 after first_2         5d

Sử dụng dplyrtidyr(hoặc bất kỳ nguồn ressling dữ liệu yêu thích nào của bạn):

library(tidyr)
library(dplyr)

mermaid(
  paste0(
    # mermaid "header", each component separated with "\n" (line break)
    "gantt", "\n", 
    "dateFormat  YYYY-MM-DD", "\n", 
    "title A Very Nice Gantt Diagram", "\n",
    # unite the first two columns (task & status) and separate them with ":"
    # then, unite the other columns and separate them with ","
    # this will create the required mermaid "body"
    paste(df %>%
            unite(i, task, status, sep = ":") %>%
            unite(j, i, pos, start, end, sep = ",") %>%
            .$j, 
          collapse = "\n"
    ), "\n"
  )
)

Như đã được @GeorgeDontas đề cập trong các nhận xét, có một thủ thuật nhỏ có thể cho phép thay đổi các nhãn của trục x thành ngày tháng thay vì 'w.01, w.02'.

Giả sử bạn đã lưu biểu đồ nàng tiên cá ở trên vào m, hãy thực hiện:

m$x$config = list(ganttConfig = list(
  axisFormatter = list(list(
    "%b %d, %Y" 
    ,htmlwidgets::JS(
      'function(d){ return d.getDay() == 1 }' 
    )
  ))
))

Cái nào mang lại:

nhập mô tả hình ảnh ở đây


Sử dụng timevis

Từ timevis GitHub :

timevischo phép bạn tạo hình ảnh trực quan về dòng thời gian phong phú và tương tác đầy đủ trong R. Dòng thời gian có thể được đưa vào ứng dụng Shiny và tài liệu đánh dấu R hoặc xem từ bảng điều khiển R và Trình xem RStudio.

library(timevis)

data <- data.frame(
  id      = 1:4,
  content = c("Item one"  , "Item two"  ,"Ranged item", "Item four"),
  start   = c("2016-01-10", "2016-01-11", "2016-01-20", "2016-02-14 15:00:00"),
  end     = c(NA          ,           NA, "2016-02-04", NA)
)

timevis(data)

Cái nào mang lại:

nhập mô tả hình ảnh ở đây


Sử dụng âm mưu

Tôi tình cờ thấy bài đăng này cung cấp một phương pháp khác bằng cách sử dụng plotly. Đây là một ví dụ:

library(plotly)

df <- read.csv("https://cdn.rawgit.com/plotly/datasets/master/GanttChart-updated.csv", 
               stringsAsFactors = F)

df$Start  <- as.Date(df$Start, format = "%m/%d/%Y")
client    <- "Sample Client"
cols      <- RColorBrewer::brewer.pal(length(unique(df$Resource)), name = "Set3")
df$color  <- factor(df$Resource, labels = cols)

p <- plot_ly()
for(i in 1:(nrow(df) - 1)){
  p <- add_trace(p,
                 x = c(df$Start[i], df$Start[i] + df$Duration[i]), 
                 y = c(i, i), 
                 mode = "lines",
                 line = list(color = df$color[i], width = 20),
                 showlegend = F,
                 hoverinfo = "text",
                 text = paste("Task: ", df$Task[i], "<br>",
                              "Duration: ", df$Duration[i], "days<br>",
                              "Resource: ", df$Resource[i]),
                 evaluate = T
  )
}

p

Cái nào mang lại:

nhập mô tả hình ảnh ở đây

Sau đó, bạn có thể thêm thông tin và chú thích bổ sung, tùy chỉnh phông chữ và màu sắc, v.v. (xem bài đăng trên blog để biết chi tiết)


Nó thực sự là tốt đẹp. Tuy nhiên, đối với tôi có vẻ khá khó để tự động tạo chuỗi này được chuyển cho nàng tiên cá, sử dụng dữ liệu được lưu trữ trong khung dữ liệu.
George Dontas

Có thể hiển thị ngày tháng dưới dạng nhãn trục x, thay vì "w.01", "w.02", v.v. không?
George Dontas

2
Override Gantt Chart Allow Tuỳ chỉnh ngày Axis Thay vì 0-52 Tuần Quy mô: github.com/rich-iannone/DiagrammeR/issues/77
George Dontas

Mã hoạt động hoàn hảo khi sử dụng DiagrameR và Mermaid trong Rstudio nhưng khi sử dụng nó trong PowerBI, tôi gặp lỗi Thông báo lỗi: Không có hình ảnh nào được tạo. Mã R không dẫn đến việc tạo ra bất kỳ hình ảnh nào. Đảm bảo rằng tập lệnh R của bạn dẫn đến một âm mưu cho thiết bị mặc định R. Bất kỳ ý tưởng nào bất cứ ai Cảm ơn Peddie
PeddiePooh

1
Các giải pháp với timevistrong Rtrông mát mẻ và đơn giản. :-)
Suman Khanal

29

Một ggplot2biểu đồ gantt đơn giản .

Đầu tiên, chúng tôi tạo một số dữ liệu.

library(reshape2)
library(ggplot2)

tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfr <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)
mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))

Bây giờ vẽ cốt truyện.

ggplot(mdfr, aes(value, name, colour = is.critical)) + 
  geom_line(size = 6) +
  xlab(NULL) + 
  ylab(NULL)

Tôi chỉ có thể tạo một số dữ liệu hai lần :-)
George Dontas

@ gd047: Cái đó gọi là facepalm hai tay. Idiocy hiện đã được sửa.
Richie Cotton

1
Nó rất hay, nhưng những gì tôi chủ yếu tìm kiếm là một cách để hiển thị nhiều hơn một thanh cho mỗi nhiệm vụ (như bạn có thể thấy trong các ví dụ tôi đã đưa ra), ví dụ một thanh cho đường cơ sở và một thanh cho thời lượng tác vụ thực tế. Có cách nào để làm điều gì đó như thế này không?
George Dontas

12

Cân nhắc sử dụng góiprojmanr (phiên bản 0.1.0 được phát hành trên CRAN vào ngày 23 tháng 8 năm 2017).

library(projmanr)

# Use raw example data
(data <- taskdata1)

taskdata1:

  id name duration pred
1  1   T1        3     
2  2   T2        4    1
3  3   T3        2    1
4  4   T4        5    2
5  5   T5        1    3
6  6   T6        2    3
7  7   T7        4 4,5 
8  8   T8        3  6,7

Bây giờ bắt đầu chuẩn bị gantt:

# Create a gantt chart using the raw data
gantt(data)

nhập mô tả hình ảnh ở đây

# Create a second gantt chart using the processed data
res <- critical_path(data)
gantt(res)

nhập mô tả hình ảnh ở đây

# Use raw example data
data <- taskdata1
# Create a network diagram chart using the raw data
network_diagram(data)

nhập mô tả hình ảnh ở đây

# Create a second network diagram using the processed data
res <- critical_path(data)
network_diagram(res)

nhập mô tả hình ảnh ở đây


7

Thử đi:

install.packages("plotrix")
library(plotrix)
?gantt.chart

7

Gói planhỗ trợ tạo biểu đồ burndown và sơ đồ gantt và chứa một plot.ganttchức năng. Xem trang Sổ tay hướng dẫn đồ họa R này

Xem thêm cách tạo một trong R bằng cách sử dụng SẠC GANTT API R của Plotly TRONG R SỬ DỤNG NHIỀU LẦN .


Điều này hoạt động khá tốt và dễ thích ứng. Tôi đã viết một hàm nhỏ để thêm các sự kiện kéo dài theo thời gian: gist.github.com/crsh/4f9ce67f408611bc3974
crsh

5

Bạn có thể làm điều đó với gói GoogleVis :

datTL <- data.frame(Position=c(rep("President", 3), rep("Vice", 3)),
                    Name=c("Washington", "Adams", "Jefferson",
                           "Adams", "Jefferson", "Burr"),
                    start=as.Date(x=rep(c("1789-03-29", "1797-02-03", 
                                          "1801-02-03"),2)),
                    end=as.Date(x=rep(c("1797-02-03", "1801-02-03", 
                                        "1809-02-03"),2)))

Timeline <- gvisTimeline(data=datTL, 
                         rowlabel="Name",
                         barlabel="Position",
                         start="start", 
                         end="end",
                         options=list(timeline="{groupByRowLabel:false}",
                                      backgroundColor='#ffd', 
                                      height=350,
                                      colors="['#cbb69d', '#603913', '#c69c6e']"))
plot(Timeline)

nhập mô tả hình ảnh ở đây

Nguồn: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html


4

Tôi đã sử dụng và sửa đổi ví dụ trên từ Richie, hoạt động như một sự quyến rũ. Phiên bản đã sửa đổi để cho biết cách mô hình của anh ấy có thể chuyển thành việc nhập dữ liệu CSV thay vì các mục văn bản được cung cấp theo cách thủ công.

LƯU Ý : Câu trả lời của Richie bị thiếu chỉ báo rằng cần có 2 gói ( reshapeggplot2 ) để mã trên / dưới hoạt động.

rawschedule <- read.csv("sample.csv", header = TRUE) #modify the "sample.csv" to be the name of your file target. - Make sure you have headers of: Task, Start, Finish, Critical OR modify the below to reflect column count.
tasks <- c(t(rawschedule["Task"]))
dfr <- data.frame(
name        = factor(tasks, levels = tasks),
start.date  = c(rawschedule["Start"]),
end.date    = c(rawschedule["Finish"]),
is.critical = c(rawschedule["Critical"]))
mdfr <- melt(dfr, measure.vars = c("Start", "Finish"))


#generates the plot
ggplot(mdfr, aes(as.Date(value, "%m/%d/%Y"), name, colour = Critical)) + 
geom_line(size = 6) +
xlab("Duration") + ylab("Tasks") +
theme_bw()

3

Đây là một bài đăng mà tôi đã viết về việc sử dụng ggplot để tạo thứ gì đó giống như biểu đồ Gantt. Không quá phức tạp, nhưng có thể cung cấp cho bạn một số ý tưởng.


Cảm ơn, đó là thực sự hữu ích
slackline

3

Đối với tôi, Gvistimeline là công cụ tốt nhất để làm điều này, nhưng kết nối trực tuyến bắt buộc của nó không hữu ích đối với tôi. Vì vậy, tôi đã tạo một gói có tên là vistimesử dụng plotly(tương tự như câu trả lời của @Steven Beaupré), vì vậy bạn có thể phóng to, v.v.:

https://github.com/shosaco/vistime

vistime: Tạo lịch trình tương tác hoặc biểu đồ Gantt bằng cách sử dụng plotly.js. Các biểu đồ có thể được đưa vào ứng dụng Shiny và được thao tác thông qua plotly_build ().

install.packages("vistime")    
library("vistime")  

dat <- data.frame(Position=c(rep("President", 3), rep("Vice", 3)),
              Name = c("Washington", "Adams", "Jefferson", "Adams", "Jefferson", "Burr"),
              start = rep(c("1789-03-29", "1797-02-03", "1801-02-03"), 2),
              end = rep(c("1797-02-03", "1801-02-03", "1809-02-03"), 2),
              color = c('#cbb69d', '#603913', '#c69c6e'),
              fontcolor = rep("white", 3))

vistime(dat, events="Position", groups="Name", title="Presidents of the USA")

nhập mô tả hình ảnh ở đây


3

Câu hỏi rất cũ, tôi biết, nhưng có lẽ đáng để ở đây - không hài lòng với câu trả lời tôi tìm thấy cho câu hỏi này - một vài tháng trước, tôi đã tạo một gói cơ bản để tạo biểu đồ Gantt dựa trên ggplot2 : ganttrify (thêm chi tiết trong readme của gói) .

Ví dụ đầu ra: nhập mô tả hình ảnh ở đây


2

Thư viện PlotPrjNetworks cung cấp các Công cụ Mạng hữu ích cho Quản lý Dự án.

library(PlotPrjNetworks)
project1=data.frame(
task=c("Market Research","Concept Development","Viability Test",
"Preliminary Design","Process Design","Prototyping","Market Testing","Final Design",
"Launching"),
start=c("2015-07-05","2015-07-05","2015-08-05","2015-10-05","2015-10-05","2016-02-18",
"2016-03-18","2016-05-18","2016-07-18"),
end=c("2015-08-05","2015-08-05","2015-10-05","2016-01-05","2016-02-18","2016-03-18",
"2016-05-18","2016-07-18","2016-09-18"))
project2=data.frame(
from=c(1,2,3,4,5,6,7,8),
to=c(2,3,4,5,6,7,8,9),
type=c("SS","FS","FS","SS","FS","FS","FS","FS"),
delay=c(7,7,7,8,10,10,10,10))
GanttChart(project1,project2)

nhập mô tả hình ảnh ở đây


Cảm ơn @George về điều này, có cách nào để sử dụng tên của nhiệm vụ từ và đến không? Tôi có nên đăng nó dưới dạng một câu hỏi mới không? Dựa trên doc github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R từ và phải là số nguyên, có cách khắc phục nhanh chóng cho điều này không?
Mohsen Sichani

1

Tôi muốn cải thiện ggplot-Answer với một số thanh cho mỗi nhiệm vụ.

Đầu tiên hãy tạo một số dữ liệu (dfrP là data.frame của câu trả lời khác, dfrR là một số data.frame khác với ngày thực hiện và mdfr là sự hợp nhất phù hợp với câu lệnh ggplot () -) sau:

library(reshape2)
tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfrP <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)
dfrR <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-22", "2010-10-10", "2010-11-01", NA)),
  end.date    = as.Date(c("2010-11-03", "2010-12-22", "2011-02-24", NA)),
  is.critical = c(TRUE, FALSE, FALSE,TRUE)
)
mdfr <- merge(data.frame(type="Plan", melt(dfrP, measure.vars = c("start.date", "end.date"))),
  data.frame(type="Real", melt(dfrR, measure.vars = c("start.date", "end.date"))), all=T)

Bây giờ vẽ biểu đồ dữ liệu này bằng cách sử dụng các khía cạnh cho tên nhiệm vụ:

library(ggplot2)
ggplot(mdfr, aes(x=value, y=type, color=is.critical))+
  geom_line(size=6)+
  facet_grid(name ~ .) +
  scale_y_discrete(limits=c("Real", "Plan")) +
  xlab(NULL) + ylab(NULL)

Nếu không có thông tin tới hạn, bạn cũng có thể sử dụng Plan / Real làm màu sắc (mà tôi rất thích), nhưng tôi muốn sử dụng data.frame của câu trả lời khác để so sánh tốt hơn.


1

Tìm thấy geom_segment trong ggplot thật tuyệt. Từ các giải pháp trước sử dụng dữ liệu nhưng không cần phải tan chảy.

library(ggplot2)

tasks <- c("Review literature", "Mung data", "Stats analysis", "Write Report")
dfr <- data.frame(
  name        = factor(tasks, levels = tasks),
  start.date  = as.Date(c("2010-08-24", "2010-10-01", "2010-11-01", "2011-02-14")),
  end.date    = as.Date(c("2010-10-31", "2010-12-14", "2011-02-28", "2011-04-30")),
  is.critical = c(TRUE, FALSE, FALSE, TRUE)
)

ggplot(dfr, aes(x =start.date, xend= end.date, y=name, yend = name, color=is.critical)) +
  geom_segment(size = 6) +
  xlab(NULL) + ylab(NULL)

GantPlot


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.