首页 > 解决方案 > 如何使用 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上面的和数据绘制旭日图?

标签: rplotlyr-plotlysunburst-diagram

解决方案


这里最大的问题是数据中缺少层次信息(哪些列是根、分支或叶?)。目前,层次结构需要由列名和值来假设 - 正如您所看到的,我添加了一个列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部分下的文档。


推荐阅读