【问题标题】:sunburst chart for multi columns in R using shiny使用闪亮的R中多列的旭日形图
【发布时间】:2021-11-17 21:06:13
【问题描述】:

考虑以下数据

 > temp
   year  v13 per_v10 per_v11 per_v12
 1 1397 2506   20.11   65.13   14.76
 2 1398 1759   16.66   79.99    3.35
 3 1399 1754   19.44   75.43    5.13

 temp<-structure(list(year = c(1397, 1398, 1399), v13 = c(2506, 1759, 
 1754), per_v10 = c(20.11, 16.66, 19.44), per_v11 = c(65.13, 79.99, 
 75.43), per_v12 = c(14.76, 3.35, 5.13)), row.names = c(NA, -3L
 ), class = "data.frame")

我想在三年内(1397、1398、1399)为 4 个变量(per_v10、per_v11、per_v12、per_v13)制作一个饼图。应该是这样的:

在每年的 Onclick (1397:1399) 中,它只显示该年的百分比。 我看到this ,但是太复杂了,我看不懂。

【问题讨论】:

    标签: r ggplot2 plotly r-plotly ggplotly


    【解决方案1】:
     temp<-structure(list(year = c(1397, 1398, 1399), v13 = c(2506, 1759, 
     1754), per_v10 = c(20.11, 16.66, 19.44), per_v11 = c(65.13, 79.99, 
     75.43), per_v12 = c(14.76, 3.35, 5.13)), row.names = c(NA, -3L
     ), class = "data.frame")
     
    # create a df
    (df <- data.frame(
         ids = c("total", paste0("total - ", temp$year), paste0("total - ", rep(temp$year, each = 3), " - ", rep(c('per_v10', 'per_v11', 'per_v12'), 3))),
         labels = c("Total", as.character(temp$year), rep(c('per_v10', 'per_v11', 'per_v12'), 3)),
         parents = c("", "total", "total", "total", rep(paste0("total - ", temp$year), each =3)),
         values = c(rep(0, 4), c(t(temp[, 3:5])))
     ))
    
    library(plotly)
    library(shiny)
    library(shiny)
     
     ui <- fluidPage(
       plotlyOutput("myplot"),
       textOutput("percent")
     )
     
     server <- function(input, output, session) {
       output$myplot <- renderPlotly({
           plot_ly(
               data = df,
               ids = ~ids,
               labels = ~labels,
               parents = ~parents,
               type = 'sunburst',
               values = ~values,
               source = "myplot_source"
           )
       })
       output$percent <- renderPrint({
            clicked <- event_data(event = "plotly_click", source = "myplot_source", priority = "event")$pointNumber + 1
            req(clicked)
            if (clicked < 5) "You are not clicking on the children"
            else paste0("Clicked percentage is ", df$values[clicked])    
       })
     }
     
    shinyApp(ui, server)
    

    我按您提供的百分比值绘制最外侧层的宽度。如果您希望每个 bin 均匀分布,请删除行 values = ~values,

    不确定 Onclick in each year 是什么意思。所以我把它变成了你提供的链接。当您点击垃圾箱时,下方的文本栏将显示点击垃圾箱的百分比。

    在 R 中绘制 sunburst 很烦人,您需要重新格式化数据框。我建议你试试Python APIs

    【讨论】:

    • Here 你可以找到一个 R 函数来格式化数据。我没有用上面的 data.frame 测试它,但它可能指向正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2019-10-12
    • 1970-01-01
    • 2016-03-25
    • 2020-03-17
    • 2016-09-12
    相关资源
    最近更新 更多