向甘特图添加阴影以描绘周末
Add shading to a gantt chart to delineate weekends
我使用 ggplot 创建了一个甘特图,代码如下:
# load packages
require("ggplot2")
require("reshape2")
###############################################################################
# Create list of tasks name strings.
tasks <- c("Write introduction", "Parse citation data",
"Construct data timeline",
"Write methods", "Model formulation",
"Model selection", "Write results", "Write discussion",
"Write abstract and editing")
# Compile dataframe of task names, and respective start and end dates.
dfr <- data.frame(
name = factor(tasks, levels = tasks),
start.date = as.Date(c("2018-04-09", "2018-04-09", "2018-04-16",
"2018-04-30", "2018-04-16", "2018-05-21",
"2018-06-04", "2018-07-02", "2018-07-30")),
end.date = as.Date(c("2018-04-30", "2018-04-20", "2018-05-18",
"2018-06-01", "2018-05-18", "2018-06-01",
"2018-06-29", "2018-07-27", "2018-08-31"))
)
# Merge start and end dates into durations.
mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))
###############################################################################
# Create gantt chart.
ggplot(mdfr, aes(value, name)) +
geom_line(size=4) +
xlab(NULL) +
ylab(NULL) +
ggtitle("Project gantt chart") +
theme_minimal() +
theme(aspect.ratio = 0.3, axis.text = element_text(size = 10))
如何设置图表格式以使周末在背景上有阴影或在背景网格上划定?
首先您需要获取工作日信息:
foo <- as.Date(mdfr$value)
# Generate days from first to last day
allDays <- seq(min(foo), max(foo), by = "days")
# Extract weekday
days <- data.frame(day = weekdays(allDays), date = allDays)
周末加geom_vline
(竖线):
library(ggplot2)
ggplot(mdfr) +
geom_vline(data = subset(days, day %in% c("Saturday", "Sunday")),
aes(xintercept = date), color = "grey80", size = 2) +
geom_line(aes(value, name), size = 4) +
labs(title = "Project gantt chart",
x = NULL,
y = NULL) +
theme_minimal() +
theme(aspect.ratio = 0.3,
axis.text = element_text(size = 10))
你可以试试
library(tidyverse)
mdfr %>%
as.tibble() %>%
mutate(date=as.POSIXct(value)) %>%
ggplot(aes(date, name)) +
geom_line(size=4) +
xlab(NULL) +
ylab(NULL) +
ggtitle("Project gantt chart") +
theme_minimal() +
theme(aspect.ratio = 0.3, axis.text = element_text(size = 10)) +
scale_x_datetime(date_minor_breaks = "7 day") +
theme(panel.grid.minor.x = element_line(size=2, color = "pink"))
思路是将value
转成POSIXct
格式(我这里用的是tidyverse
,但不是必须的),然后在[=14=中指定即可] 与 "7 days
的小中断。他们每周六开始。使用更大的尺寸也可以覆盖星期天。
我使用 ggplot 创建了一个甘特图,代码如下:
# load packages
require("ggplot2")
require("reshape2")
###############################################################################
# Create list of tasks name strings.
tasks <- c("Write introduction", "Parse citation data",
"Construct data timeline",
"Write methods", "Model formulation",
"Model selection", "Write results", "Write discussion",
"Write abstract and editing")
# Compile dataframe of task names, and respective start and end dates.
dfr <- data.frame(
name = factor(tasks, levels = tasks),
start.date = as.Date(c("2018-04-09", "2018-04-09", "2018-04-16",
"2018-04-30", "2018-04-16", "2018-05-21",
"2018-06-04", "2018-07-02", "2018-07-30")),
end.date = as.Date(c("2018-04-30", "2018-04-20", "2018-05-18",
"2018-06-01", "2018-05-18", "2018-06-01",
"2018-06-29", "2018-07-27", "2018-08-31"))
)
# Merge start and end dates into durations.
mdfr <- melt(dfr, measure.vars = c("start.date", "end.date"))
###############################################################################
# Create gantt chart.
ggplot(mdfr, aes(value, name)) +
geom_line(size=4) +
xlab(NULL) +
ylab(NULL) +
ggtitle("Project gantt chart") +
theme_minimal() +
theme(aspect.ratio = 0.3, axis.text = element_text(size = 10))
如何设置图表格式以使周末在背景上有阴影或在背景网格上划定?
首先您需要获取工作日信息:
foo <- as.Date(mdfr$value)
# Generate days from first to last day
allDays <- seq(min(foo), max(foo), by = "days")
# Extract weekday
days <- data.frame(day = weekdays(allDays), date = allDays)
周末加geom_vline
(竖线):
library(ggplot2)
ggplot(mdfr) +
geom_vline(data = subset(days, day %in% c("Saturday", "Sunday")),
aes(xintercept = date), color = "grey80", size = 2) +
geom_line(aes(value, name), size = 4) +
labs(title = "Project gantt chart",
x = NULL,
y = NULL) +
theme_minimal() +
theme(aspect.ratio = 0.3,
axis.text = element_text(size = 10))
你可以试试
library(tidyverse)
mdfr %>%
as.tibble() %>%
mutate(date=as.POSIXct(value)) %>%
ggplot(aes(date, name)) +
geom_line(size=4) +
xlab(NULL) +
ylab(NULL) +
ggtitle("Project gantt chart") +
theme_minimal() +
theme(aspect.ratio = 0.3, axis.text = element_text(size = 10)) +
scale_x_datetime(date_minor_breaks = "7 day") +
theme(panel.grid.minor.x = element_line(size=2, color = "pink"))
思路是将value
转成POSIXct
格式(我这里用的是tidyverse
,但不是必须的),然后在[=14=中指定即可] 与 "7 days
的小中断。他们每周六开始。使用更大的尺寸也可以覆盖星期天。