Bagan Gantt dengan R [tertutup]

Jawaban:

109

Sekarang ada beberapa cara elegan untuk menghasilkan bagan Gantt di R.

Menggunakan 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)

masukkan deskripsi gambar di sini

Menggunakan 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
")

masukkan deskripsi gambar di sini

Temukan contoh ini dan banyak lagi di DiagrammeR GitHub


Jika data Anda disimpan dalam a data.frame, Anda dapat membuat string untuk diteruskan mermaid()dengan mengonversinya ke format yang tepat.

Pertimbangkan hal berikut:

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

Menggunakan dplyrdan tidyr(atau sumber daya pertengkaran data favorit Anda):

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"
  )
)

Seperti yang disebutkan oleh @GeorgeDontas di komentar, ada sedikit peretasan yang memungkinkan untuk mengubah label sumbu x menjadi tanggal daripada 'w.01, w.02'.

Dengan asumsi Anda menyimpan grafik putri duyung di atas m, lakukan:

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

Pemberian yang mana:

masukkan deskripsi gambar di sini


Menggunakan timevis

Dari timevis GitHub :

timevismemungkinkan Anda membuat visualisasi garis waktu yang kaya dan sepenuhnya interaktif di R. Garis waktu dapat disertakan dalam aplikasi Shiny dan dokumen penurunan harga R, atau dilihat dari konsol R dan RStudio Viewer.

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)

Pemberian yang mana:

masukkan deskripsi gambar di sini


Menggunakan secara plotly

Saya menemukan posting ini memberikan metode lain menggunakan plotly. Berikut contohnya:

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

Pemberian yang mana:

masukkan deskripsi gambar di sini

Anda kemudian dapat menambahkan informasi dan anotasi tambahan, menyesuaikan font dan warna, dll. (Lihat entri blog untuk detailnya)

Steven Beaupré
sumber
Itu memang bagus. Namun menurut saya agak sulit untuk secara otomatis membuat string ini yang diteruskan ke putri duyung, menggunakan data yang disimpan dalam kerangka data.
George Dontas
Apakah mungkin menampilkan tanggal sebagai label sumbu x, daripada "w.01", "w.02" dll?
George Dontas
2
Timpa Bagan Gantt untuk Mengizinkan Sumbu Tanggal Kustom Alih-alih Skala Minggu 0-52
George Dontas
Kode bekerja dengan sempurna menggunakan DiagrameR dan Mermaid di Rstudio tetapi ketika menggunakannya di PowerBI saya mendapat pesan kesalahan Pesan Kesalahan: Tidak ada gambar yang dibuat. Kode R tidak menghasilkan visual apa pun. Pastikan skrip R Anda menghasilkan plot ke perangkat default R. Ada ide siapa pun Terima kasih Peddie
PeddiePooh
1
Solusinya dengan timevisin Rterlihat keren dan sederhana. :-)
Suman Khanal
29

ggplot2Bagan gantt sederhana .

Pertama, kami membuat beberapa data.

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"))

Sekarang gambar plotnya.

ggplot(mdfr, aes(value, name, colour = is.critical)) + 
  geom_line(size = 6) +
  xlab(NULL) + 
  ylab(NULL)
Richie Cotton
sumber
Saya hanya dapat membuat beberapa data dua kali :-)
George Dontas
@ gd047: Itu membutuhkan penutup wajah dua tangan. Kebodohan sekarang sudah diperbaiki.
Richie Cotton
1
Ini sangat bagus, tetapi yang paling saya cari adalah cara untuk menampilkan lebih dari satu batang untuk setiap tugas (seperti yang Anda lihat dalam contoh yang saya berikan) misalnya satu untuk garis dasar dan satu untuk durasi tugas sebenarnya. Apakah ada cara untuk melakukan hal seperti ini?
George Dontas
12

Pertimbangkan untuk menggunakan paketprojmanr (versi 0.1.0 dirilis di CRAN pada 23 Agustus 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

Sekarang mulai siapkan gantt:

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

pengguna2030503
sumber
7

Coba ini:

install.packages("plotrix")
library(plotrix)
?gantt.chart
juur
sumber
5

Anda dapat melakukannya dengan paket 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)

masukkan deskripsi gambar di sini

Sumber: https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html

vonjd
sumber
4

Saya menggunakan dan memodifikasi contoh di atas dari Richie, bekerja seperti pesona. Versi yang dimodifikasi untuk menunjukkan bagaimana modelnya dapat diterjemahkan ke dalam menyerap data CSV, bukan item teks yang diberikan secara manual.

CATATAN : Jawaban Richie tidak ada indikasi bahwa 2 paket ( bentuk ulang dan ggplot2 ) diperlukan agar kode di atas / di bawah berfungsi.

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()
saya terkekang
sumber
3

Berikut adalah posting yang saya tulis tentang menggunakan ggplot untuk menghasilkan sesuatu seperti bagan Gantt. Tidak terlalu canggih, tetapi mungkin memberi Anda beberapa ide.

neilfws
sumber
Terima kasih, itu sangat berguna
slackline
3

Bagi saya, Gvistimeline adalah alat terbaik untuk melakukan ini, tetapi koneksi online yang diperlukan tidak berguna bagi saya. Jadi saya membuat sebuah paket bernama vistimethat useplotly (mirip dengan jawaban @Steven Beaupré), jadi Anda bisa memperbesar dll .:

https://github.com/shosaco/vistime

vistime: Buat garis waktu interaktif atau bagan Gantt menggunakan plotly.js. Bagan dapat dimasukkan dalam aplikasi Shiny dan dimanipulasi melalui 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")

masukkan deskripsi gambar di sini

shosaco
sumber
3

Pertanyaan yang sangat lama, saya tahu, tetapi mungkin layak untuk ditinggalkan dari sini - tidak puas dengan jawaban yang saya temukan untuk pertanyaan ini - beberapa bulan yang lalu saya membuat paket dasar untuk membuat bagan Gantt berbasis ggplot2: ganttrify (detail lebih lanjut di readme paket) .

Contoh keluaran: masukkan deskripsi gambar di sini

giocomai
sumber
2

Library PlotPrjNetworks menyediakan Alat Jaringan yang berguna untuk Manajemen Proyek.

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)

masukkan deskripsi gambar di sini

George Dontas
sumber
Terima kasih @George untuk ini, adakah cara untuk menggunakan nama tugas di from dan to? Boleh saya posting sebagai pertanyaan baru? Berdasarkan doc github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R dari dan harus integer, apakah ada perbaikan cepat untuk ini?
Mohsen Sichani
1

Saya ingin meningkatkan ggplot-Answer dengan beberapa baris untuk setiap tugas.

Pertama buat beberapa data (dfrP adalah data.frame dari jawaban lain, dfrR adalah beberapa data.frame lain dengan tanggal realisasi dan mdfr adalah penggabungan yang sesuai dengan pernyataan ggplot () - berikut):

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)

Sekarang plot data ini menggunakan faset untuk nama tugas:

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)

Tanpa is.critical-information Anda juga dapat menggunakan Plan / Real sebagai warna (yang saya lebih suka), tetapi saya ingin menggunakan data.frame dari jawaban lain untuk membuatnya lebih sebanding.

Thomas Runge
sumber
1

Menemukan geom_segment di ggplot sangat bagus. Dari solusi sebelumnya menggunakan data tetapi tidak perlu meleleh.

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

Kbushu
sumber