如何在R语言Plotly中调整桑基图的悬浮提示框
桑基图(ggsankey+Plotly)悬浮提示问题
我有按年份和型号分类的销售数据,通过桑基图结合Plotly做可视化,但在悬浮提示(hover)上遇到两个问题:
- 第一种悬浮模式下,仅显示型号,无法展示对应年份的销售数据:

- 切换到第二种悬浮模式后,提示内容会合并显示,但图表上无端出现model: F的错误标注:

以下是我使用的代码:
df <- data.frame (model = c("A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J"), Year = c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,2019,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020), sales = c(450,678,456,344,984,456,234,244,655,789,234,567,234,567,232,900,1005,1900,450,345,567,235,456,345,144,333,555,777,111,444,222,223,445,776,331,788,980,1003,456,434,345,2222,3456,456,678,8911,4560,4567,4566,5555,6666,7777,8888,1233,1255,5677,3411,2344,6122,4533)) ################################################################################################## library(ggsankey) library(tidyverse) library(plotly) # df from the question is unchanged # visualize the original (plot <- ggplot(df, aes(Year, node = model, fill = model, value = sales)) + geom_sankey_bump(space = 0, type = "alluvial", color = "transparent", smooth = 15) + scale_fill_viridis_d(option = "A", alpha = .8) + theme_sankey_bump(base_size = 16)) ggplotly(plot) -> plp plp #-------- colors -------- # collect the 10 colors cols <- map_dfr(1:10, function(k){ nm <- plp$x$data[[k]]$name filler <- plp$x$data[[k]]$fillcolor c(nm = nm, filler = filler) }) ################################################################################################## #--------------- collect values for hovertext positions ---------- x <- plp$x$data[[1]]$x inds <- which(x %in% 2015:2020, arr.ind = T) yrs <- x[inds] tellMe <- invisible( map(1:length(plp$x$data), function(m) { y <- plp$x$data[[m]]$y y[inds] }) %>% setNames(sort(unique(df$model))) %>% # changed from LETTERS[1:10] as.data.frame() %>% mutate(yr = yrs %>% as.integer()) %>% pivot_longer(names_to = "model", values_to = "sales", cols = sort(unique(df$model))) %>% distinct() %>% group_by(yr, model) %>% summarise(val = mean(sales)) %>% left_join(df, by = c("yr" = "Year", "model" = "model")) %>% as.data.frame() # drop groups ) #-------------- create data trace for hovertext -------------- plot_ly(tellMe, x = ~yr, y = ~val, split = ~model, customdata = ~sales, text = ~model, line = list(width = .01, shape = "spline", smoothing = 1.3), hovertemplate = "Year: %{x}<br>Model: %{text}<br>Sales: %{customdata}<extra></extra>", type = "scatter", mode = "lines", showlegend = F) -> pp2 pp2 ################################################################################################## # change colors to match sankey pp2 <- plotly_build(pp2) invisible( map(1:10, function(z) { nm <- pp2$x$data[[z]]$name # collect and assign the color cr <- unlist(cols[cols$nm == nm, "filler"], use.names = F) pp2$x$data[[z]]$line$color <<- cr }) ) ################################################################################################################################# #-------------- consolidate the traces (subplot won't work) ----------- # collect data one more time! dx <- plp$x$data yx <- pp2$x$data yx <- append(yx, dx) # put plt on top # replace data plp$x$data <- yx # lines are small, increase the distance searched for matches plp %>% layout(hoverdistance = 40)
内容的提问来源于stack exchange,提问作者user18948933
相关产品推荐
相关产品推荐

