如何在R的ggplot中按value_out.net排序堆叠柱散点图的Fuel类别
解决方法
你的问题出在堆叠条形图的每个Fuel对应多条数据,直接用reorder()会默认对重复的value_out.net取均值,导致排序逻辑不对。以下两种方法可以实现按value_out.net升序/降序排列:
方法1:先预处理数据,修改Fuel的因子顺序
先提取每个Fuel对应的唯一value_out.net值,再重新设置Fuel的因子水平:
# 如果用dplyr处理数据 library(dplyr) # 升序排序:获取每个Fuel的net值并按升序排列 fuel_order_asc <- all_fuels %>% distinct(Fuel, value_out.net) %>% # 保留每个Fuel对应的唯一net值 arrange(value_out.net) %>% # 按net升序排序 pull(Fuel) # 提取排序后的Fuel名称 # 降序排序只需要把arrange改成arrange(desc(value_out.net)) fuel_order_desc <- all_fuels %>% distinct(Fuel, value_out.net) %>% arrange(desc(value_out.net)) %>% pull(Fuel) # 将Fuel转为因子,指定排序后的水平 all_fuels <- all_fuels %>% mutate(Fuel = factor(Fuel, levels = fuel_order_asc)) # 这里换成fuel_order_desc就是降序
之后直接运行你原来的绘图代码即可,coord_flip()后Fuel会按指定顺序排列。
方法2:直接在ggplot的aes中用reorder指定排序逻辑
不需要修改原数据,直接在x轴的映射里用reorder(),并指定FUN=unique来获取每个Fuel的唯一net值作为排序依据:
# 升序版本 fuels_out_plot_w_tot_order <- ggplot() + geom_bar(data = all_fuels, aes(x = reorder(Fuel, value_out.net, FUN = unique), y = value_out, fill = stage_emission), stat = "identity") + geom_point(data = all_fuels, aes(x = reorder(Fuel, value_out.net, FUN = unique), y = value_out.net), size = 1) + scale_y_continuous("g CO2e/kWh", sec.axis = sec_axis(~ . / conv_mj_kwh, name = "g CO2e/MJ")) + theme(legend.title = element_blank()) + ggtitle("Well-to-wheel emissions (powertrain efficiency considered)") + coord_flip(); fuels_out_plot_w_tot_order # 降序版本只需要把value_out.net改成desc(value_out.net) fuels_out_plot_w_tot_order_desc <- ggplot() + geom_bar(data = all_fuels, aes(x = reorder(Fuel, desc(value_out.net), FUN = unique), y = value_out, fill = stage_emission), stat = "identity") + geom_point(data = all_fuels, aes(x = reorder(Fuel, desc(value_out.net), FUN = unique), y = value_out.net), size = 1) + scale_y_continuous("g CO2e/kWh", sec.axis = sec_axis(~ . / conv_mj_kwh, name = "g CO2e/MJ")) + theme(legend.title = element_blank()) + ggtitle("Well-to-wheel emissions (powertrain efficiency considered)") + coord_flip(); fuels_out_plot_w_tot_order_desc
这样就能让Fuel类别按黑色点的value_out.net值完成升序或降序排序了。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

