R语言按指定分组重排热图:按致命事故数排序航空安全热图
问题原因
你当前代码排序不符合预期的核心原因是reorder(airline, value)的默认逻辑,会对每个航空公司名下所有3类指标(事故总数、致命事故数、死亡人数)的value取均值,按跨指标的综合均值排序,没有单独提取致命事故的数值作为排序依据。
另外代码同时加载plyr和dplyr会出现同名函数覆盖问题,容易触发无意义报错,建议移除plyr加载,用dplyr原生函数做数据处理。
解决方法
只需要修改Y轴的因子排序逻辑:仅保留「致命事故数」对应的数值作为排序权重,其余指标的数值在排序时设为NA忽略,即可实现按致命事故数单独排序、数值最高的航司显示在Y轴最顶部的需求。
修改后的完整可运行代码如下:
# 加载包 ----------- # 已移除plyr加载,避免和dplyr函数冲突 library(tidyverse) library(ggplot2) library(reshape2) library(scales) library(forcats) # 读取数据 airlines <- read.csv("/Volumes/GoogleDrive/My Drive/Uni/DVN/AT2/Blog 2/airline_incidents.csv", header = TRUE) # 选取需要的列 airlines_00_14 <- airlines[,c(1,6,7,8)] # 转换为长表 airlines_00_14.m <- melt(airlines_00_14) # 按指标分组归一化数值用于热图映射 airlines_00_14.m <- airlines_00_14.m %>% group_by(variable) %>% mutate(rescale = rescale(value)) %>% ungroup() # 绘制热图 (q <- airlines_00_14.m %>% ggplot(aes(x = variable, # 核心修改:仅用致命事故列的数值作为排序依据 # 若你数据里致命事故对应的variable名称不一致,替换引号内的内容即可 y = reorder(airline, ifelse(variable == "fatal_accidents_00_14", value, NA), na.rm = TRUE))) + geom_tile(aes(fill = rescale), colour = "white") + scale_fill_gradient(low = "white", high = "steelblue") + # 可选:修改坐标轴标签为更易读的中文 scale_x_discrete(labels = c("incidents_00_14" = "事故总数", "fatal_accidents_00_14" = "致命事故数", "fatalities_00_14" = "死亡人数")) + labs(x = "统计指标", y = "航空公司", fill = "归一化数值") )
注意事项
- 如果运行后发现致命事故数最高的航司出现在Y轴最底部,只需要把排序代码里的
value改为-value即可反转排序顺序。 - 如果一定要用
plyr,请确保plyr的加载顺序在dplyr之前,避免函数冲突。
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

