标题: Highcharter 中的堆叠条形图问题:系列映射不正确
身体: 我正在使用 R 中的 highcharter 包制作堆积条形图,并遇到系列数据未正确映射到 x 轴上指定类别的问题。我的数据集包括容量、运算符和计数列,我正在尝试显示每个容量中每个运算符的计数百分比。
问题: 图表中的每个条形应代表一个容量,并且在每个条形内,每个操作员都应有分段(堆栈),代表其百分比份额。但是,该图表错误地将所有操作员映射到单个容量或将它们重叠,而不是将它们分布在不同的容量中。
数据结构: 数据结构如下(示例):
capacity,operator,count
3,Operator1,39
3,Operator2,6916
...
7,Operator1,2729
7,Operator2,23504
...
代码: 这是我正在使用的代码片段:
library(highcharter)
library(dplyr)
# Data loading and preparation
data <- read.csv("path_to_data.csv", fileEncoding = "UTF-8")
total_counts_by_capacity <- data %>%
group_by(capacity) %>%
summarise(TotalCount = sum(count))
data_with_total <- merge(data, total_counts_by_capacity, by = "capacity")
data_with_percentage <- data %>%
left_join(total_counts_by_capacity, by = "capacity") %>%
mutate(Percentage = round((count / TotalCount) * 100, 2))
hc <- highchart() %>%
hc_chart(type = "bar") %>%
hc_title(text = "Capacity by Operator Percentage") %>%
hc_xAxis(categories = unique(data_with_percentage$capacity)) %>%
hc_yAxis(title = list(text = "Percentage")) %>%
hc_tooltip(shared = TRUE, pointFormat = "<span style='color:{series.color}'>{series.name}</span>: <b>{point.y}</b><br/>") %>%
hc_plotOptions(series = list(stacking = "normal"))
unique_operators <- unique(data_with_percentage$operator)
for (op in unique_operators) {
op_data <- filter(data_with_percentage, operator == op )
hc <- hc %>% hc_add_series(name = op, data = op_data$Percentage)
}
hc
问题: 虽然代码运行没有错误,但生成的图表未按预期正确显示数据。所有操作员都映射到单个容量栏,而不是根据各自的容量进行分配。
我不确定问题是否出在我过滤数据或将系列添加到图表的方式上。任何关于如何将系列数据正确映射到各自容量的见解或建议将不胜感激。
如下图所示,百分比不应超过100%。然而,存在一个问题,即运营商错误地链接到了他们不应该关联的容量,导致总百分比超过 100%。此外,如果百分比可以显示在条形本身上,那将是有益的。
不幸的是,无法根据您的示例数据重现该问题。相反,人们会得到你想要的。另外,乍一看,我没有发现您的代码有任何问题。
因此,我的猜测是问题出在你的数据上。第一个可能的问题是您的数据顺序不正确,即您在
xAxis
中 x 轴上映射的类别未链接到您在 hc_add_series
中添加为数据的百分比值的顺序,即您必须确保数据正确排序,否则值将分配给错误的类别。其次,如果你的不完整,即如果你没有 obs,也会出现同样的问题。每个操作员的所有能力。要解决这个问题,您可以/必须使用例如来完成您的数据tidyr::complete
。
首先,我使用一个更通用的示例数据集,其中数据未正确排序并添加了第三个运算符:
data <- structure(
list(
capacity = c(3L, 3L, 10L, 7L, 7L, 10L),
operator = c(
"Operator1",
"Operator2", "Operator2", "Operator1", "Operator2", "Operator3"
), count = c(39L, 6916L, 23504L, 2729L, 23504L, 23504L)
),
class = "data.frame", row.names = c(
NA,
-6L
)
)
data
#> capacity operator count
#> 1 3 Operator1 39
#> 2 3 Operator2 6916
#> 3 10 Operator2 23504
#> 4 7 Operator1 2729
#> 5 7 Operator2 23504
#> 6 10 Operator3 23504
在此数据集上运行代码反映了帖子中图像中的一些问题,即对于新添加的
Operator3
,该值分配给容量级别 3 而不是 10,而对于 Operator1
,该值针对容量级别7 现在被错误地分配给新的容量级别 10。在后一种情况下,问题是级别 10 现在是第二个类别,因此被分配给运算符 1 的第二个值。
为了解决这两个问题,我首先使用
tidy::complete
完成数据集,并最终按容量和运算符排列数据集。另请注意,我稍微重构并简化了您的数据整理代码,但这对问题没有影响。
data_with_percentage <- data %>%
tidyr::complete(capacity, operator, fill = list(count = 0)) |>
group_by(capacity) %>%
mutate(
TotalCount = sum(count),
Percentage = round(count / TotalCount * 100, 2)
) |>
mutate(capacity = factor(capacity)) |>
arrange(operator, capacity)
hc <- highchart() %>%
hc_chart(type = "bar") %>%
hc_title(text = "Capacity by Operator Percentage") %>%
hc_xAxis(categories = unique(data_with_percentage$capacity)) %>%
hc_yAxis(title = list(text = "Percentage")) %>%
hc_tooltip(shared = TRUE, pointFormat = "<span style='color:{series.color}'>{series.name}</span>: <b>{point.y}</b><br/>") %>%
hc_plotOptions(series = list(stacking = "normal"))
unique_operators <- unique(data_with_percentage$operator)
for (op in unique_operators) {
op_data <- filter(data_with_percentage, operator == op)
hc <- hc %>%
hc_add_series(name = op, data = op_data$Percentage)
}
hc