按diff变量升序排序条形图:仅展示指定变量的实现方法
解决方案:按
diff值排序条形图(不显示diff) 我明白你遇到的问题了——想用reorder()按diff的值给geo分组排序,但直接在aes()里筛选values的方式行不通,因为reorder()需要每个geo分组对应唯一的排序依据值,而不是从长格式的列里挑子集(这样会导致长度不匹配,触发错误)。
下面给你两种简洁可行的解决方案,假设你的数据是长格式(包含geo分组列、variable列(值为HH_FIN_EX/ACT_IND_CON_EXP/diff)、value数值列):
方法1:用dplyr预处理排序依据
先提取每个geo对应的diff值,再用这个值来重排geo的顺序:
library(ggplot2) library(dplyr) # 1. 筛选需要展示的两个变量 plot_data <- your_data_frame %>% filter(variable %in% c("HH_FIN_EX", "ACT_IND_CON_EXP")) # 2. 提取每个geo对应的diff值(作为排序依据) diff_reference <- your_data_frame %>% filter(variable == "diff") %>% select(geo, diff_value = value) # 3. 绘图时用reorder匹配每个geo的diff值排序 ggplot(plot_data, aes( x = reorder(geo, diff_reference$diff_value[match(geo, diff_reference$geo)]), y = value, fill = variable )) + geom_col(position = "dodge") + # 并列条形图 labs(x = "Geo区域", y = "数值", fill = "变量")
方法2:用forcats::fct_reorder更简洁
forcats包的fct_reorder专门处理因子排序,代码更直观:
library(ggplot2) library(dplyr) library(forcats) # 1. 把diff值转换成"geo名:diff值"的命名向量 diff_named_vec <- your_data_frame %>% filter(variable == "diff") %>% tibble::deframe() # 自动把geo列作为名字,value列作为对应值 # 2. 筛选绘图数据并绘图 your_data_frame %>% filter(variable %in% c("HH_FIN_EX", "ACT_IND_CON_EXP")) %>% ggplot(aes( x = fct_reorder(geo, diff_named_vec[geo]), # 按diff值升序排geo y = value, fill = variable )) + geom_col(position = "dodge") + labs(x = "Geo区域", y = "数值", fill = "变量")
为什么你的原代码会出错?
你之前写的reorder(geo, values[values=="diff"])逻辑有问题:values[values=="diff"]会返回所有variable等于"diff"的value元素,但reorder需要每个geo对应一个排序值,这个子集的长度和geo分组的长度不匹配,所以R会抛出错误。
内容的提问来源于stack exchange,提问作者Justas Mundeikis
相关产品推荐
相关产品推荐

