如何在不改变Plotly堆叠柱状图的前提下修正图例顺序?
解决Plotly堆叠柱状图图例顺序反转问题(保留堆叠顺序)
问题描述
使用Plotly绘制堆叠柱状图时,已通过因子定义了堆叠顺序(从下到上为Sugar→Spice→Everything nice→Chemical X),但图例顺序出现反转:最顶层的Chemical X位于图例顶部,最底层的Sugar位于图例底部,且需要保留堆叠效果。
解决方案
在layout的legend参数中添加traceorder='normal',强制图例顺序与数据中因子的定义顺序保持一致,无需修改堆叠顺序或数据结构。
修改后的完整代码
library(plotly) library(dplyr) ds <- data.frame(X = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), Y = c(50, 10, 100, 500, 60, 20, 200, 600, 70, 30, 300, 700, 70, 40, 400, 700), Z = c("Sugar", "Spice", "Everything nice", "Chemical X")) %>% mutate(Z = factor(Z, c("Sugar", "Spice", "Everything nice", "Chemical X"))) plt <- plot_ly(ds) %>% add_trace( x = ~X, y = ~Y, color = ~Z, type = 'bar', hoverinfo = 'text', textposition = 'none') %>% layout(bargap = 0.1, barmode = 'stack', legend = list(orientation = 'v', yanchor = "center", y = 0.5, font = list(size = 17), traceorder = 'normal')) # 关键修正参数 plt
原理说明
- Plotly在
barmode='stack'模式下,默认将图例顺序设置为reversed,即图例从上到下的顺序与堆叠从下到上的顺序相反。 traceorder='normal'会强制图例按照add_trace生成的轨迹顺序(即你定义的因子顺序)排列,从而让图例从上到下的顺序与堆叠从下到上的顺序完全匹配。
替代方案(不推荐)
如果不想使用traceorder参数,也可以通过反转因子顺序并关闭堆叠反转来实现,但这种方法需要修改数据结构,不如前者直观:
library(forcats) ds <- ds %>% mutate(Z = fct_rev(Z)) # 反转因子顺序 plt <- plot_ly(ds) %>% add_trace( x = ~X, y = ~Y, color = ~Z, type = 'bar', hoverinfo = 'text', textposition = 'none') %>% layout(bargap = 0.1, barmode = 'stack', reversestack = FALSE, # 关闭堆叠反转 legend = list(orientation = 'v', yanchor = "center", y = 0.5, font = list(size = 17))) plt
内容的提问来源于stack exchange,提问作者Thiago Godoy
相关产品推荐
相关产品推荐

