如何让plot_ly绘制的分组柱状图按犯罪数量降序排列?
解决plot_ly分组柱状图排序无效的问题
核心原因
plot_ly绘制离散型x轴的柱状图时,默认会按照因子水平顺序或字母顺序排列类别,和你预先排序的数据框行顺序无关,所以直接排序数据不会生效。
两种有效解决方法
方法1:在layout中手动指定x轴类别顺序
- 先提取你需要的排序依据(比如按总逮捕数降序),生成排序后的类别向量:
# 假设你的数据框是df,包含category(分组类别)、arrest_count(逮捕数)、group(分组变量,如年份) library(dplyr) # 按每个category的总逮捕数降序,提取排序后的类别列表 sorted_categories <- df %>% group_by(category) %>% summarise(total_arrest = sum(arrest_count)) %>% arrange(desc(total_arrest)) %>% pull(category)
- 绘制柱状图时,在
layout()的xaxis参数中指定排序规则:
library(plotly) plot_ly(df, x = ~category, y = ~arrest_count, color = ~group, type = "bar") %>% layout( xaxis = list( categoryorder = "array", # 告诉plot_ly用自定义数组排序 categoryarray = sorted_categories # 指定排序后的类别数组 ) )
方法2:修改类别变量的因子水平顺序
如果你的category是因子类型,可以直接修改其水平顺序,plot_ly会自动沿用这个顺序:
# 将category转换为因子,水平顺序设为sorted_categories df$category <- factor(df$category, levels = sorted_categories) # 直接绘制,无需额外设置layout plot_ly(df, x = ~category, y = ~arrest_count, color = ~group, type = "bar")
注意事项
- 如果你的排序依据不是总逮捕数,而是某一特定分组的逮捕数(比如2023年的逮捕数),只需要调整
sorted_categories的生成逻辑即可,比如过滤对应分组再排序。 - 确保
sorted_categories包含所有x轴的类别,没有遗漏或多余值。
内容的提问来源于stack exchange,提问作者sikimimi
相关产品推荐
相关产品推荐

