R [kapalı] olan Gantt grafikleri


Yanıtlar:


109

Artık R'de bir Gantt grafiği oluşturmanın birkaç zarif yolu var.

Candela'yı kullanma

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)

görüntü açıklamasını buraya girin

Diyagramın Kullanılması

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

görüntü açıklamasını buraya girin

GitHub'da bu örneği ve daha fazlasını bulunDiagrammeR


Verileriniz bir içinde depolanıyorsa , uygun biçime dönüştürerek data.framegeçirilecek dizeyi oluşturabilirsiniz mermaid().

Aşağıdakileri göz önünde bulundur:

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

Kullanılması dplyrve tidyr(veya favori verilerin ressources sürtüşme varsa):

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

@GeorgeDontas tarafından yorumlarda belirtildiği gibi , x ekseninin etiketlerini 'w.01, w.02' yerine tarihlere değiştirmeye izin verebilecek küçük bir hack var.

Yukarıdaki deniz kızı grafiğini kaydettiğinizi varsayarsak, şunları yapın m:

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

Hangi verir:

görüntü açıklamasını buraya girin


Timevis kullanma

Gönderen timevis GitHub'dan :

timevisR'de zengin ve tam etkileşimli zaman çizelgesi görselleştirmeleri oluşturmanıza olanak tanır . Zaman çizelgeleri Shiny uygulamalara ve R markdown belgelerine dahil edilebilir veya R konsolu ve RStudio Görüntüleyiciden görüntülenebilir.

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)

Hangi verir:

görüntü açıklamasını buraya girin


Komplo kullanarak

Bu yazıya başka bir yöntem kullanarak tökezledim plotly. İşte bir örnek:

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

Hangi verir:

görüntü açıklamasını buraya girin

Daha sonra ek bilgi ve ek açıklamalar ekleyebilir, yazı tiplerini ve renkleri özelleştirebilirsiniz vb. (Ayrıntılar için blog gönderisine bakın)


Gerçekten güzel. Ancak, bir veri çerçevesinde depolanan verileri kullanarak denizkızına iletilen bu dizeyi otomatik olarak oluşturmak bana oldukça zor görünüyor.
George Dontas

Tarihleri ​​"w.01", "w.02" vb. Yerine x ekseni etiketleri olarak görüntülemek mümkün mü?
George Dontas


Kod, Rstudio'da DiagrameR ve Mermaid kullanılarak mükemmel çalışıyor, ancak PowerBI'de kullanırken bir hata mesajı aldım Hata Mesajı: Görüntü oluşturulmadı. R kodu, herhangi bir görselin oluşturulmasına neden olmadı. R komut dosyanızın R varsayılan aygıtına bir çizim oluşturduğundan emin olun. Herhangi bir fikir herhangi biri Teşekkürler
Peddie

1
İle çözüm timevisiçinde Rgörünüyor serin ve basit. :-)
Suman Khanal

29

Basit bir ggplot2gantt şeması.

Önce bazı veriler oluşturuyoruz.

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

Şimdi arsa çizin.

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

Bazı verileri yalnızca iki kez oluşturabildim :-)
George Dontas

@ gd047: Bu, iki elli bir facepalm gerektirir. Aptallık düzeltildi.
Richie Pamuk

1
Çok güzel, ama çoğunlukla aradığım şey, her görev için birden fazla çubuk göstermenin bir yolu (verdiğim örneklerde görebileceğiniz gibi), örneğin biri temel ve diğeri gerçek görev süresi için. Böyle bir şey yapmanın bir yolu var mı?
George Dontas

12

Paketiprojmanr kullanmayı düşünün (23 Ağustos 2017'de CRAN'da yayınlanan sürüm 0.1.0).

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

Şimdi gantt hazırlamaya başlayın:

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin

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

görüntü açıklamasını buraya girin


7

Bunu dene:

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


5

Bunu GoogleVis paketi ile yapabilirsiniz :

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)

görüntü açıklamasını buraya girin

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


4

Richie'den yukarıdaki örneği kullandım ve değiştirdim, bir cazibe gibi çalıştı. Modelinin manuel olarak sağlanan metin öğeleri yerine CSV verilerini beslemeye nasıl çevrilebileceğini göstermek için değiştirilmiş sürüm.

NOT : Richie'nin cevabı, yukarıdaki / aşağıdaki kodun çalışması için 2 paketin ( yeniden şekillendirme ve ggplot2 ) gerekli olduğuna dair bir gösterge eksikti .

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

İşte bir Gantt şeması gibi bir şey oluşturmak için ggplot kullanarak yazdığım bir gönderi . Çok karmaşık değil, ama size bazı fikirler verebilir.


Teşekkürler, bu gerçekten kullanışlı
slackline

3

Benim için Gvistimeline bunu yapmak için en iyi araçtı, ancak gerekli çevrimiçi bağlantısı benim için yararlı olmadı. Böylece (@Steven Beaupré'nin cevabına benzer) vistimekullanan bir paket oluşturdum plotly, böylece yakınlaştırabilirsiniz vb .:

https://github.com/shosaco/vistime

vistime: Plotly.js kullanarak etkileşimli zaman çizelgeleri veya Gantt grafikleri oluşturun. Grafikler Shiny uygulamalarına dahil edilebilir ve plotly_build () aracılığıyla değiştirilebilir.

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

görüntü açıklamasını buraya girin


3

Çok eski bir soru, biliyorum, ama belki de buradan ayrılmaya değer - bu soruya bulduğum cevaplardan memnun kalmadım - birkaç ay önce ggplot2 tabanlı Gantt çizelgeleri yapmak için temel bir paket hazırladım: ganttrify (paketin benioku dosyasında daha fazla ayrıntı) .

Örnek çıktı: görüntü açıklamasını buraya girin


2

Library PlotPrjNetworks , Proje Yönetimi için faydalı Ağ Araçları sağlar.

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)

görüntü açıklamasını buraya girin


Bunun için teşekkürler @George gelen ve kullanım Görevler adıyla bir yolu var mı? Ben doktor dayanarak? Yeni bir soru olarak gönderebilir Shall github.com/cran/PlotPrjNetworks/blob/master/R/PlotPrjNetworks.R dan ve tamsayı olmalıdır, bunun için hızlı bir düzeltme var mı?
Mohsen Sichani

1

Ggplot-Answer'ı her görev için birkaç çubukla geliştirmek istiyorum.

İlk olarak bazı verileri oluşturun (dfrP, diğer cevabın data.frame'i, dfrR gerçekleşme tarihlerine sahip başka bir data.frame'dir ve mdfr, aşağıdaki ggplot () - ifadesine uyan bir birleştirmedir):

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)

Şimdi görev adı için yönleri kullanarak bu verileri çizin:

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)

İs.critical-information olmadan, Plan / Real'i renk olarak da kullanabilirsiniz (ki bunu tercih ederim), ancak daha iyi karşılaştırılabilir hale getirmek için diğer cevabın data.frame'ini kullanmak istedim.


1

Ggplot'taki geom_segment'in harika olduğunu buldum. Önceki çözümlerden verileri kullanır ancak eritmeye gerek yoktur.

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.