简体   繁体   English

在ggplot和R中的甘特图中创建一致的条形颜色

[英]Creating consistent bar colors in Gantt chart in ggplot and R

I reused the same R code with multiple different datasets to produce gantt charts. 我将相同的R代码与多个不同的数据集重复使用以生成甘特图。

require("tidyverse")

task0 <- c('Strategy 1', 'Strategy 1', '2017-04-01', '2020-04-01',0, "Strategy")
task1 <- c('Strategy 1', 'Collect data', '2017-04-01', '2018-04-01',1, "In Progress")
task2 <- c('Strategy 1', 'Clean data', '2018-04-01', '2018-06-01', 1, "Completed")
task3 <- c('Strategy 1', 'Analyse data', '2018-06-01', '2019-04-01',1, "Discontinued")
task4 <- c('Strategy 1', 'Write report', '2019-04-01', '2020-04-01', 1, "Planned")

dataset <- as.data.frame(rbind(task0, task1, task2, task3, task4))
names(dataset) <- c('StrategyName', 'Activity', 'Start', 'End', 'ActivitySort', "Status")


dataset <-  as_tibble(dataset)
dataset <-  dataset  %>% mutate(StartSort = as.Date(Start, "%Y-%m-%d" ))
dataset <-  dataset %>% arrange(StrategyName, desc(ActivitySort), desc(StartSort),Activity,  End)

acts <- c("Planned","Discontinued","In Progress","Completed", "Strategy")
actcols <- c("#000000","#548235", "#2E75B6", "#BF9000", "#7030A0")
els <-unique(dataset$Activity)

g.gantt <- gather(dataset, "state", "date", 3:4) %>% mutate(date = as.Date(date, "%Y-%m-%d" ), Status=factor(Status, acts[length(acts):1]), Activity=factor(Activity, els))

plot <- ggplot(g.gantt, aes(date, Activity, color = Status, group=Activity)) +
  geom_line(size = 5) +
  scale_color_manual(values=actcols, name="Status") +
  labs(x="Project year", y=NULL, title="Activity timeline")

plot + theme(axis.text.y = element_text(hjust = 0))

If the chart data contains all of the status codes, Strategy, In Progress, Completed, Discontinued and Planned then chart colors appear as intended. 如果图表数据包含所有状态码,即“策略”,“进行中”,“已完成”,“已终止”和“计划中”,则图表颜色将按预期显示。

However, I the chart data does not contain all 5 status codes, then the manual colors are not set correctly and consistently. 但是,我的图表数据不包含所有5个状态代码,因此手动颜色设置不正确且一致。 For instance, completed status may no longer appear green. 例如,完成状态可能不再显示为绿色。

How do I format/set the manual colors so that completed will always appear green regardless of the number of other statuses contained in the dataset? 如何格式化/设置手动颜色,以便无论数据集中包含的其他状态数量如何,完成的颜色始终显示为绿色?

Thanks to teunbrand's comment for the answer. 感谢teunbrand的评论为您提供答案。 I did have to tweak sorting. 我确实需要调整排序。

require("tidyverse")

task0 <- c('Strategy 1', 'Strategy 1', '2017-04-01', '2020-04-01',0, "Strategy")
task1 <- c('Strategy 1', 'Collect data', '2017-04-01', '2018-04-01',1, "In Progress")
task2 <- c('Strategy 1', 'Clean data', '2018-04-01', '2018-06-01', 1, "Completed")
task3 <- c('Strategy 1', 'Analyse data', '2018-06-01', '2019-04-01',1, "Discontinued")
task4 <- c('Strategy 1', 'Write report', '2019-04-01', '2020-04-01', 1, "Planned")

dataset <- as.data.frame(rbind(task0, task1, task2, task3, task4))
names(dataset) <- c('StrategyName', 'Activity', 'Start', 'End', 'ActivitySort', "Status")


dataset <-  as_tibble(dataset)
dataset <-  dataset  %>% mutate(StartSort = as.Date(Start, "%Y-%m-%d" ))
dataset <-  dataset %>% arrange(StrategyName, desc(ActivitySort), desc(StartSort),Activity,  End)

acts <- c("Strategy", "Completed","In Progress", "Discontinued","Planned")
actcols <- c("#000000","#548235", "#2E75B6", "#BF9000", "#7030A0")
els <-unique(dataset$Activity)

g.gantt <- gather(dataset, "state", "date", 3:4) %>% mutate(date = as.Date(date, "%Y-%m-%d" ), Status=factor(Status, acts[length(acts):1]), Activity=factor(Activity, els))

plot <- ggplot(g.gantt, aes(date, Activity, color = Status, group=Activity)) +
  geom_line(size = 5) +
  scale_color_manual(values=actcols, name="Status",  breaks = acts, limits = acts) +
  labs(x="Project year", y=NULL, title="Activity timeline")

plot + theme(axis.text.y = element_text(hjust = 0))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM