【问题标题】:How do you plot values in mupltiple columns into a sunburst chart using plotly library?如何使用 plotly 库将多列中的值绘制到旭日形图中?
【发布时间】:2020-03-17 11:50:12
【问题描述】:

我的数据格式如下:

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 和上面的数据绘制旭日图?

【问题讨论】:

  • @VojtechKania 你检查过下面的方法了吗?

标签: r plotly r-plotly sunburst-diagram


【解决方案1】:

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

但是,您可能想查看this 的答案,了解能够正确表示分层数据的输入格式。

此外,请查看Sunburst with Repeated Labels部分下的文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-07-22
    • 2021-01-02
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多