我正在尝试更改 R 中 highcharter 图中堆积条的顺序和颜色。
当我在 ggplot 中遇到这个问题时,我已经习惯于定义因子级别,并且在 highcharter 中搜索解决方案时找到了一些答案,建议在 hc_xAxis() 中类似地定义类别,但这还没有为我工作。尝试这样做会对我的 x 轴造成严重破坏(不再将其显示为日期)并且它仍然不会改变顺序。我也不喜欢指定单个堆叠条的颜色,我习惯在 ggplot 中使用 scale_fill_manual() 来执行此操作,但这里看起来颜色是按字母顺序映射的。
我的目标是按如下顺序(从下到上)获得堆叠条形图:TL > WB > PB > UB > NACx > ACx。
这是我的数据框:
df <- structure(list(Week = structure(c(19478, 19478, 19478, 19478,
19478, 19478, 19478, 19485, 19485, 19485, 19485, 19485, 19485,
19485, 19492, 19492, 19492, 19492, 19492, 19492, 19492, 19499,
19499, 19499, 19499, 19499, 19499, 19499, 19506, 19506, 19506,
19506, 19506, 19506, 19506, 19513, 19513, 19513, 19513, 19513,
19513, 19513), class = "Date"), Status = c("ACx", "NACx", "PB",
"Plan", "TL", "UB", "WB", "ACx", "NACx", "PB", "Plan", "TL",
"UB", "WB", "ACx", "NACx", "PB", "Plan", "TL", "UB", "WB", "ACx",
"NACx", "PB", "Plan", "TL", "UB", "WB", "ACx", "NACx", "PB",
"Plan", "TL", "UB", "WB", "ACx", "NACx", "PB", "Plan", "TL",
"UB", "WB"), Units = c(0, 7.13, 46.49, 298.03, 48.11, 20.25,
166.12, 0, 12.87, 67, 298.03, 47, 38, 126.26, 0, 9, 66.27, 328.37,
53.25, 90.25, 98.62, 0, 9.25, 53.13, 355.89, 53.11, 180.5, 45.13,
4, 2.88, 0, 269.55, 6, 169.5, 0, 0, 0, 0, 355.89, 0, 0, 0)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -42L), groups = structure(list(
Week = structure(c(19478, 19485, 19492, 19499, 19506, 19513
), class = "Date"), .rows = structure(list(1:7, 8:14, 15:21,
22:28, 29:35, 36:42), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L), .drop = TRUE))
...和情节:
highchart() %>%
hc_add_series(subset(df, Status == "Plan"), "column", grouping = FALSE, stack = "Plan",
color = 'rgba(255, 255, 255, 0)', borderColor = "black",
hcaes(x = Week, y = round(Units, digits = 1), group = Status)) %>%
hc_add_series(subset(df, Status != "Plan"), type = 'column', grouping = FALSE, stack = "Activity",
borderColor = "black", color = cols,
hcaes(y = Units, group=Status, x = Week)) %>%
hc_chart(plotBackgroundColor = "#F5F5F5") %>%
hc_plotOptions(series = list(stacking = "normal")) %>%
hc_xAxis(dateTimeLabelFormats = list(week = '%d-%b'), type = "datetime",
title = list(text = "Week Commencing"), gridLineWidth = 1, tickInterval = 604800000) %>%
hc_yAxis(title = list(text = "Activity)"))
cols <- c("ACx" = "#311432",
"NACx" = "#a1045a",
"WB" = "forestgreen",
"TL" = "#D3D3D3",
"PB" = "goldenrod",
"UB" = "#bc544b")
非常感谢任何帮助。
一个选项是将
Status
转换为 factor
,并按照您想要的顺序设置级别。之后你也可以根据这个顺序重新排序你的颜色。
library(highcharter)
levels <- c("TL","WB", "PB", "UB", "NACx", "ACx", "Plan")
df$Status <- factor(df$Status, rev(levels))
cols <- cols[levels(df$Status)]
cols <- cols[!is.na(names(cols))]
highchart() %>%
hc_add_series(subset(df, Status == "Plan"), "column",
grouping = FALSE, stack = "Plan",
color = "rgba(255, 255, 255, 0)", borderColor = "black",
hcaes(x = Week, y = round(Units, digits = 1), group = Status)
) %>%
hc_add_series(subset(df, Status != "Plan"),
type = "column", grouping = FALSE, stack = "Activity",
borderColor = "black", color = cols,
hcaes(y = Units, group = Status, x = Week)
) %>%
hc_chart(plotBackgroundColor = "#F5F5F5") %>%
hc_plotOptions(series = list(stacking = "normal")) %>%
hc_xAxis(
dateTimeLabelFormats = list(week = "%d-%b"), type = "datetime",
title = list(text = "Week Commencing"), gridLineWidth = 1, tickInterval = 604800000
) %>%
hc_yAxis(title = list(text = "Activity)"))