r - 如何使用 plotly 库将多列中的值绘制到旭日形图中?
问题描述
我的数据格式如下:
DF <- data.frame(Name = c("Joe", "Albert", "Marianne", "Anastasia", "John"),
Total = c(36, 21, 38, 30, 29),
Total1 = c(16, 10, 24, 18, 22),
Subtotal11 = c(8, 6, 14, 5, 20),
Subtotal12 = c(8, 4, 10, 13, 2),
Total2 = c(20, 11, 14, 12, 7),
Subtotal21 = c(8, 4, 14, 11, 2),
Subtotal22 = c(12, 7, 0, 1, 5))
DF
Name Total Total1 Subtotal11 Subtotal12 Total2 Subtotal21 Subtotal22
1 Joe 36 16 8 8 20 8 12
2 Albert 21 10 6 4 11 4 7
3 Marianne 38 24 14 10 14 14 0
4 Anastasia 30 18 5 13 12 11 1
5 John 29 22 20 2 7 2 5
你将如何使用plotly library
上面的和数据绘制旭日图?
解决方案
这里最大的问题是数据中缺少层次信息(哪些列是根、分支或叶?)。目前,层次结构需要由列名和值来假设 - 正如您所看到的,我添加了一个列parents
来提供我认为应该是的结构:
Name value parents
1: All Total 154 <NA>
2: Joe Total 36 All Total
3: Albert Total 21 All Total
4: Marianne Total 38 All Total
5: Anastasia Total 30 All Total
...
32: Joe Subtotal22 12 All Total - Joe Total - Joe Total2
33: Albert Subtotal22 7 All Total - Albert Total - Albert Total2
34: Marianne Subtotal22 0 All Total - Marianne Total - Marianne Total2
35: Anastasia Subtotal22 1 All Total - Anastasia Total - Anastasia Total2
36: John Subtotal22 5 All Total - John Total - John Total2
这就是我认为你所追求的:
library(data.table)
library(plotly)
DF <- data.frame(Name = c("Joe", "Albert", "Marianne", "Anastasia", "John"),
Total = c(36, 21, 38, 30, 29),
Total1 = c(16, 10, 24, 18, 22),
Subtotal11 = c(8, 6, 14, 5, 20),
Subtotal12 = c(8, 4, 10, 13, 2),
Total2 = c(20, 11, 14, 12, 7),
Subtotal21 = c(8, 4, 14, 11, 2),
Subtotal22 = c(12, 7, 0, 1, 5))
setDT(DF)
DT <- melt.data.table(DF, id.vars = "Name")
DT[, Name := paste(Name, variable)]
total_sum <- sum(DT[variable %in% "Total"]$value)
DT[, variable := NULL]
DT <- rbindlist(list(list(Name = "All Total", value = total_sum), DT))
DT[, parents := c(
NA_character_,
rep("All Total", 5),
"All Total - Joe Total",
"All Total - Albert Total",
"All Total - Marianne Total",
"All Total - Anastasia Total",
"All Total - John Total",
rep(
c("All Total - Joe Total - Joe Total1",
"All Total - Albert Total - Albert Total1",
"All Total - Marianne Total - Marianne Total1",
"All Total - Anastasia Total - Anastasia Total1",
"All Total - John Total - John Total1"),
2
),
"All Total - Joe Total",
"All Total - Albert Total",
"All Total - Marianne Total",
"All Total - Anastasia Total",
"All Total - John Total",
rep(
c("All Total - Joe Total - Joe Total2",
"All Total - Albert Total - Albert Total2",
"All Total - Marianne Total - Marianne Total2",
"All Total - Anastasia Total - Anastasia Total2",
"All Total - John Total - John Total2"),
2
)
)]
DT[, ids := fifelse(is.na(parents), yes = Name, no = paste(parents, Name, sep =" - "))]
plot_ly(data = DT, ids = ~ids, labels= ~Name, parents = ~parents, values= ~value, type='sunburst', branchvalues = 'total')
但是,您可能希望查看能够正确表示分层数据的输入格式的答案。
此外,请查看Sunburst with Repeated Labels部分下的文档。
推荐阅读
- java - 如何使用 java 流对 ArrayList 的元素求和,这些元素是 HashMap 的值?
- php - 如何将 HTTP 输入映射到函数?
- postgresql - SELECT ... NOWAIT 可以“死锁”吗?
- mysql - 如何将数据从一列行复制到同一列但不同的行
- angular - 在生产中更改 Angular 应用程序中的服务器 IP
- json - JQ:从数字对象中选择键
- vba - 如何在 VBA 中过滤减去 XX 个工作日?
- wicket - Wicket 获取按钮组件文本
- c# - IClientProxy.SendAsync 字符串方法参数中还有哪些其他选项?
- .net - 如何将附件添加到具有 (PDF/A-3) 文件格式的 pdf 文件?